当使用 -l
选项(例如 -lfoo
)链接库时,如果找到两者,gcc将更喜欢共享对象(更喜欢 libfoo.so
到 libfoo.a
) . 有没有办法让gcc更喜欢静态库,如果两者都找到了?
我正在尝试解决的问题如下:我正在为应用程序(飞行模拟器称为X-Plane)创建一个插件,具有以下约束:
-
该插件将采用32位共享对象的形式,即使在64位系统上运行也是如此
-
运行环境没有提供一种方便的方法来加载不在'normal'位置的共享对象,例如
/usr/lib
或/usr/lib32
: -
一个人不能指望用户设置
LD_PRELOAD
或LD_LIBRARY_PATH
来查找我的插件附带的共享对象 -
在动态加载插件共享对象之前,X-Plane运行环境不会将我的插件目录添加到``LD_LIBRARY_PATH,这将允许我将所有必需的共享对象与我的插件共享对象一起发送
-
我不能指望64位用户安装非平凡的32位共享对象(比如说,不包含在ubuntu上的ia32-libs包中)
为了解决上述约束,一种可能的解决方案是将生成的共享对象链接到所使用的所有非平凡库的静态32位版本 . 但是,在安装这些库时,通常会安装静态和动态版本,因此gcc将始终链接到共享对象而不是静态库 .
当然,移动/删除/删除有问题的共享对象,只是将静态库留在说 /usr/lib32
,是一种解决方法,但它不是一个好的
注意:
-
是的,我确实读过如何链接共享对象和库,而且我完全静态地链接了共享对象'
-
是的,我试过
-Wl,-static -lfoo -Wl,-Bdynamic,
但没有带来预期的结果 -
是的,我也试过
-l:libfoo.a
,但这也没有带来预期的结果
3 回答
它已过时,但可能有效:http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html
(几乎在页面的末尾)
“如前所述,通过在命令行上指定库的完整路径,也可以直接链接到各个库文件 . ”
您可以指定静态库的完整路径,而不使用
-l
标志来链接这些库 .只需将
.a
文件添加到链接行,而不是-l
,就像它是.o
文件一样 .