【问题标题】:g++ linking .so libraries that may not be compiled yetg ++链接可能尚未编译的.so库
【发布时间】:2012-03-03 10:40:31
【问题描述】:

我正在帮助开发一个 c++ 应用程序。该应用程序非常大,分布在不同的子目录之间。它使用脚本为每个项目目录自动生成 qt .pro 文件,然后使用 qmake 生成 make 文件。目前这些库正在按字母顺序编译..当一个试图链接的库尚未构建时,这显然会导致链接错误..是否有某种 g++ 标志我可以设置,这样如果一个库它就不会出错尝试链接尚未建立?还是通过 qt .pro 文件使其首先构建依赖项的方法?

注意: 该脚本在 ubuntu 10.10 上运行良好,因为构建共享库的语句不需要我使用 -l(libraryname) 链接到我的其他库,但 ubuntu 11.10 这样做了,所以它在 11.10 上编译时给了我未定义的参考错误。

【问题讨论】:

  • 听起来你需要一个合适的 Makefile。
  • 你确定它不只是链接到一些以前在 Ubuntu 中构建的库吗?我看不出它是如何成功链接到不存在的库文件的。
  • 不应该。它在我们的代码生成库的位置给出错误的库。干净的重建在 10.10 上工作正常。 11.10 给了我未定义的参考错误。
  • 是否有某种顺序可以全部构建,或者是否存在循环依赖关系?
  • 有些库是循环依赖的...

标签: c++ qt makefile g++ qmake


【解决方案1】:

您是否考虑过使用 Qt Creator 作为构建环境和 IDE?我个人从未将它用于 Ubuntu 上的开发,但我已经在带有 g++ 的 Windows 上使用它,它在那里工作得很好。而且它似乎已经以package in the repository 的形式提供。

使用它可以获得的一些好处是:

  • Qt Creator 将(通常)为您管理 .pro 文件。 (如果你和我一样,你仍然可以在这里添加很多额外的东西,但它会在添加到项目时自动添加 .cpp、.h 和 .ui 文件。)
  • 您可以设置项目间依赖项,这些依赖项将按照项目需要链接的任何顺序构建项目。
  • 您可以使用它与 gdb 的集成来单步调试和调试代码,以及跳转到代码。
  • 您可以自动完成 Qt 信号和插槽,以及内联语法突出显示和一些错误检查。
  • 如果您使用 GUI,则可以使用集成设计器来直观地布局和设计表单。

回到您的实际问题,我认为当链接失败时,标志不可能告诉 gcc 不会出错,因为链接器无法懒惰地链接库。如果它链接到静态库(.a),那么它需要能够将该代码的实现实际复制到可执行文件/库中。如果它的动态链接(.so),它仍然需要验证所需的函数是否确实存在于库中。如果在联动步骤中不能联动,什么时候可以联动?

事后想一想,如果在你的编译过程中存在循环依赖(A 依赖于 B,B 依赖于 C,C 依赖于 A),那么你可能需要先构建一个虚假版本的库,它只有用于实现每个函数的空存根,以及每个类或对象的完整定义。然后,在链接到该库的同时构建其他所有内容,最后,构建假库的真实版本,并将其链接到已链接的所有其他版本。不过,我认为这仅适用于动态链接。

【讨论】:

    【解决方案2】:

    您可以使用 subdirs 项目来控制构建顺序(无论其他开发人员是否想要它:))。

    例如

    build_all.pro

    TEMPLATE=subdirs
    CONFIG+=ordered
    SUBDIRS=lib2/lib2.pro lib1/lib1.pro app/app.pro
    

    lib1.pro, lib2.pro, ... 是您生成的 pro 文件。 然后为 build_all.pro 运行一次 qmake 并在该目录中运行 make。这将在 lib1 和 app 之前构建 lib2。

    【讨论】:

      猜你喜欢
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多