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

Áko*_*róy 22 linux gcc shared-libraries static-linking

当对使用库链接-l选项(比方说-lfoo),GCC会喜欢一个共享对象静态库,如果两者都发现了(会喜欢libfoo.solibfoo.a).有没有办法让gcc更喜欢静态库,如果两者都找到了?

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

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

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

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

注意:

  • 是的,我确实阅读了如何链接共享对象和库,我并没有尝试创建一个"完全静态链接的共享对象"
  • 是的,我试过-Wl,-static -lfoo -Wl,-Bdynamic,但没有带来预期的结果
  • 是的,我也尝试-l:libfoo.a过,但这也没有带来预期的结果

Mat*_*Mat 10

您可以指定静态库的完整路径,而不使用-l标记链接这些库.

gcc ... source.c ... /usr/lib32/libmysuperlib.a ...
Run Code Online (Sandbox Code Playgroud)

  • 当然,但是......现在我必须真正_知道_静态库在哪里,而使用“-l”,我只需要传递我需要的库的名称 (2认同)

Ang*_*lom 7

只需将.a文件添加到链接行,而不-l必将其作为.o文件.