代码之家  ›  专栏  ›  技术社区  ›  Michał Górny

可移植的静态链接到某个库的方法

  •  2
  • Michał Górny  · 技术社区  · 15 年前

    我正在创建一个实用程序,它依赖于 libassuan 除其他因素外。虽然其他的提供共享库, 利巴苏 只有静态的。

    利巴苏 附带简单的 libassuan-config 提供的工具 CFLAGS 和; LDFLAGS 供编译器/链接器使用。这些 LDFLAGS 将库称为 -lassuan .

    标准make调用的结果是:

    cc   -I/usr/include/libmirage -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include     -lmirage -lglib-2.0   -L/usr/lib64 -lassuan -o mirage2iso mirage2iso.c mirage-getopt.o mirage-wrapper.o mirage-password.o
    mirage-password.o: In function `mirage_input_password':
    mirage-password.c:(.text+0x1f): undefined reference to `assuan_pipe_connect'
    mirage-password.c:(.text+0x32): undefined reference to `assuan_strerror'
    collect2: ld returned 1 exit status
    make: *** [mirage2iso] Error 1

    (我刚开始写这个单元,所以没有更多的错误)

    因此,如果我正确理解结果,gcc不想将应用程序链接到 libassuan.a .

    使用 -static 这将导致GCC更喜欢静态库,而不是未插入的共享库。我看到过建议使用类似这样的解决方案:

    -Wl,-Bstatic -lassuan -Wl,-Bdynamic
    

    但我不认为它是便携式的。

    我认为最好的解决方案是提供静态库文件的完整路径,但是 libassuan配置 没有提供太多帮助(我能从中得到的只是 -L/usr/lib64 -lassuan )

    也许我应该尝试通过解析返回的静态库路径来创建静态库路径 LDFLAGS 并使用 -L 目录名和 -l 为了图书馆的名字,然后希望在所有情况下 libassuan配置 会像那样还的。

    你觉得怎么样?是否有任何好的、简单的和可移植的解决方案来解决这个问题?

    另外,请注意,尽管我在这里指的是gcc,但我想使用一些可以与其他编译器一起使用的工具。

    PS2.另外一个问题:如果包只安装静态库,则返回 LDFLAGS 而不是充满 .la 路径可以被视为bug?

    3 回复  |  直到 15 年前
        1
  •  1
  •   nos    15 年前

    GCC将链接到libassuan.a,如果它找不到libassuan.so。

    可能是链接时在静态库中查找顺序符号。命令很重要。 ) 假设GCC可以找到libassuan.a,并且它实际上提供了链接器抱怨的功能,那么尝试:

    c c-i/usr/include/libmirage-i/usr/include/glib-2.0-i/usr/lib64/glib-2.0/include-l mirage-l glib-2.0-l/usr/lib64-o mirage2iso mirage2iso.c mirage getopt.o mirage wrapper.o mirage password.o-lassuan

    既然您说libassuan在/usr/lib64下,它可能是64位库,那么您的应用程序和其他库也是64位库吗?

        2
  •  1
  •   P Shved    15 年前

    编译器的命令行选项不是可移植的。这是没有标准的。每一个编译器都使用自己的,而有些编译器只能非正式地同意以命令行格式相互遵从。最便于携带的链接方式是使用 libassuan-config 当然。我认为,它不仅可以为gcc生成标志,还可以为其他编译器生成标志。如果不能,那么就不存在可移植的方法了,我想(除了cmake或更高级别的东西)。

    命令行到 cc 你的表现完全正确。如果您有一个静态库libassuan.la,它的路径将提供给 -L 选项,然后编译器会链接到它。您可以从它的输出中看到它:它是否没有找到静态库,它是否会抱怨错误消息,如“can't find-lassuan”。我

    此外,如果没有找到libassuan.so,那么编译器将静态链接到库,即使您没有使用 -Wl,-Bstatic 材料或 -static 旗帜。

    您的问题可能是系统中多个版本的libassuan的持久性。除此之外,我看不出你提供的内容有任何错误。

        3
  •  0
  •   mmmmmm    15 年前

    哪一个目录是libassuan.a in

    我认为第一个错误不是GCC不想把应用链接到libassuan.a,而是GCC不知道libassuan.a在哪里。您需要传递gcc a-l参数,给出libassuan.a的路径。 例如 -L/主页/路径