2011-04-09 112 views
17

当使用-l选项(比如说-lfoo)链接库时,如果找到两者(将更喜欢libfoo.solibfoo.a),gcc将优先选​​择共享对象到静态库。有没有办法让gcc更喜欢静态库,如果两者都找到了?使链接时,gcc偏好静态库共享对象?

我试图解决的问题是:我创建一个插件应用程序(飞行模拟器称为X平面),有以下限制:

  • 插件是即使在64位系统上运行时也是32位共享对象的形式运行环境不提供加载不在“正常”位置中的共享对象的便利方式,如/usr/lib/usr/lib32
    • 一个不能指望用户设置LD_PRELOADLD_LIBRARY_PATH找到我的插件附带的共享对象
    • 在动态加载插件共享对象之前,X-Plane运行环境不会将我的插件目录添加到LD_LIBRARY_PATH,这将允许我将所有我需要的共享对象沿着我的插件共享对象
  • 人们不能指望64个用户安装32位共享对象是不平凡的(比方说,没有在IA32-库包ubuntu上包括)

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

当然,移动/删除/删除共享对象的问题,只是在离开静态库中说/usr/lib32,是一个变通,但它不是一个很好的一个

注:

  • 是的,我也阅读了关于如何链接共享对象&库,而我并不想creatae一个“完全静态链接的共享对象”
  • 是的,我试过-Wl,-static -lfoo -Wl,-Bdynamic,但并没有带来预期的结果
  • 是的,我试过-l:libfoo.a为好,但这并没有带来预期的结果,无论是

回答

5

就在.a文件添加到链接线不-l就好像它是一个.o文件。

7

您可以指定静态库的完整路径,而不需要-l标志与这些标志链接。

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