2009-09-03 36 views
2

我正在创建一个实用程序,取决于libassuan撇开其他依赖。虽然这些'其他'提供共享库,但libassuan只有静态的。便携式方式静态链接到其中一个库

libassuan都配备了简单libassuan-config工具,它旨在为编译器/连接器使用提供CFLAGS & LDFLAGS。这些LDFLAGS将该库称为-lassuan

化妆的标准调用的结果则是:

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优先选择静态库而不是缩进的shared。我见过的解决方案建议使用类似的东西:

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

但我不认为这将是一个便携式。

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

也许我应该尝试通过“解析”来创建静态库的路径返回LDFLAGS和使用-L目录名和-l的库名 - 然后希望在所有情况下libassuan-config将返回它这样。

您对此有何看法?有没有好的,简单的便携式解决方案来解决这个问题?

PS。请注意,虽然我在这里指的是gcc,但我想使用能够与其他编译器一起工作的东西。

PS2。还有一个问题:如果包只安装静态库,返回LDFLAGS而不是完整的.la路径可以被认为是一个错误?

回答

1

GCC将链接到libassuan.a如果它没有找到libassuan.so

这也可能是符号在静态库抬头的顺序,当你链接。订单很重要。 ) 假设GCC可以找到libassuan.a,它实际上提供了接头抱怨的功能,尝试:

CC -I/USR /包含/ libmirage -I的/ usr /包括/油嘴-2.0 -I/USR /lib64/glib-2.0/include -lmirage -lglib-2.0 -L/usr/lib64 -o mirage2iso mirage2iso.c mirage-getopt。o mirage-wrapper.o mirage-password.o -lassuan

既然你说libassuan位于/ usr/lib64下,它可能是一个64位的库,你的应用程序和其他库是否也是64位?

+0

非常感谢你,将'LDFLAGS'移动到命令行结束后,一切正常。虽然'libassuan-config'没有像pkg-config一样提供拆分'LDFLAGS'&'LIBS'。 – 2009-09-03 18:23:18

0

哪个目录是libassuan.a在

我觉得第一个错误是不是GCC不想要连接的应用libassuan.a更GCC不知道从哪里libassuan.a。你需要传递gcc一个-L参数给libassuan.a的路径。 例如 -L /家庭/路径

1

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

您显示的命令行为cc是完全正确的。如果你有一个静态库libassuan.la,并且它的路径被提供给-L选项,那么编译器就会链接它。你可以从它的输出中看到它:它没有找到静态库,它会抱怨错误信息,如“无法找到-lassuan”。 I

此外,如果没有找到libassuan.so,则编译器将静态链接到您的库,即使您没有使用-Wl,-Bstatic stuff或-static标志。

您的问题可能在于系统中libassuan的多个版本的持久性。除此之外,我没有看到你提供的任何错误。