gpt4 book ai didi

c - 静态链接到其中一个库的可移植方式

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:36 28 4
gpt4 key购买 nike

我正在创建一个依赖于 libassuan 除了其他依赖的实用程序。虽然这些“其他”提供共享库,但 libassuan 仅提供静态库。

libassuan 带有简单的 libassuan-config 工具,它旨在为编译器提供 CFLAGSLDFLAGS/链接器使用。这些 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.omirage-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 statusmake: *** [mirage2iso] Error 1

(I've just started writing this unit and that's why there aren't more errors)

So, if I understand the result correctly, gcc doesn't want to link the app to libassuan.a.

Using -static here will cause gcc to prefer static libraries over shared which is unindented. I've seen solution suggesting using something like that:

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

但我不认为它会是可移植的。

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

也许我应该尝试通过“解析”返回的 LDFLAGS 并使用 -L 作为目录名称和 -l 作为库名称——然后希望在所有情况下 libassuan-config 都会像那样返回它。

你怎么看?有没有好的、简单的、可移植的解决方案来解决这个问题?

附言。请注意,虽然我在这里指的是 gcc,但我想使用可以与其他编译器一起正常工作的东西。

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

最佳答案

如果找不到 libassuan.so,gcc 将链接到 libassuan.a

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

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 -o mirage2iso mirage2iso .c mirage-getopt.o mirage-wrapper.o mirage-password.o -lassuan

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

关于c - 静态链接到其中一个库的可移植方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1374746/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com