g ++链接.so可能尚未编译的库

时间:2012-02-11 00:20:19

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

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

注意: 这个脚本在ubuntu 10.10上运行正常,因为构建共享库的语句并不要求我使用-l(libraryname)链接到我的其他库,但ubuntu 11.10这样做是因为它在11.10编译时给了我未定义的引用错误。

2 个答案:

答案 0 :(得分:1)

您是否考虑过将Qt Creator用作构建环境和IDE?我个人从来没有在Ubuntu上用它进行开发,但我在Windows上使用它与g ++,它在那里工作得很好。它似乎已作为package in the repository提供。

使用它的一些优点是:

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

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

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

答案 1 :(得分:1)

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

E.g。

build_all.pro

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

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