我正在帮助c ++应用程序。应用程序非常大,分布在不同的子目录之间。它使用脚本为每个项目目录自动生成qt .pro文件,然后使用qmake生成make文件。目前这些库正在按字母顺序编译..当它试图链接的库尚未构建时,显然会导致链接错误..是否有某种g ++标志我可以设置所以它不会错误,如果一个库它的库试图链接还没有建成?或者首先通过qt .pro文件建立依赖关系的方法?
注意: 这个脚本在ubuntu 10.10上运行正常,因为构建共享库的语句并不要求我使用-l(libraryname)链接到我的其他库,但ubuntu 11.10这样做是因为它在11.10编译时给了我未定义的引用错误。
答案 0 :(得分:1)
您是否考虑过将Qt Creator用作构建环境和IDE?我个人从来没有在Ubuntu上用它进行开发,但我在Windows上使用它与g ++,它在那里工作得很好。它似乎已作为package in the repository提供。
使用它的一些优点是:
回到你的实际问题,我不认为当链接失败时,一个标志告诉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。