在链接时使gcc更喜欢静态库到共享对象?

时间:2011-04-09 09:12:40

标签: linux gcc shared-libraries static-linking

使用-l选项(例如-lfoo)链接库时,如果找到两者,gcc会更喜欢共享对象(更喜欢libfoo.so到{{1} }})。有没有办法让gcc更喜欢静态库,如果两者都找到了?

我正在尝试解决的问题如下:我正在为应用程序(飞行模拟器称为X-Plane)创建一个插件,具有以下约束:

  • 插件将采用32位共享对象的形式,即使在64位系统上运行也是如此
  • 运行环境无法提供加载不在“正常”位置的共享对象的便捷方式,例如libfoo.a/usr/lib
    • 我们不能指望用户设置/usr/lib32LD_PRELOAD来查找我的插件附带的共享对象
    • 在动态加载插件共享对象之前,X-Plane运行环境不会将我的插件目录添加到``LD_LIBRARY_PATH,这将允许我将所有必需的共享对象与我的插件共享对象一起发送
  • 我不能指望64位用户安装非平凡的32位共享对象(比如说,不包含在ubuntu上的ia32-libs包中)

为了解决上述约束,一种可能的解决方案是将生成的共享对象链接到所使用的所有非平凡库的静态32位版本。但是,在安装这些库时,通常会安装静态和动态版本,因此gcc将始终链接到共享对象而不是静态库。

当然,移动/删除/删除有问题的共享对象,只是将静态库放在说LD_LIBRARY_PATH中,是一种解决办法,但它不是一个好的

请注意:

  • 是的,我确实读过如何链接共享对象&图书馆,我并不是试图创建一个“完全静态链接的共享对象”
  • 是的,我尝试/usr/lib32但没有带来预期的结果
  • 是的,我也试过了-Wl,-static -lfoo -Wl,-Bdynamic,,但这并没有带来预期的结果

3 个答案:

答案 0 :(得分:7)

您可以指定静态库的完整路径,而不使用-l标志与之链接。

gcc ... source.c ... /usr/lib32/libmysuperlib.a ...

答案 1 :(得分:5)

只需将.a文件添加到没有-l的链接行,就像它是.o文件一样。

答案 2 :(得分:2)

已过时,但可能有效:http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

(几乎在页面的末尾)

如前所述,通过在命令行上指定库的完整路径,也可以直接链接到各个库文件。