如何强制执行qmake库依赖项的顺序?

时间:2012-10-03 23:04:45

标签: qt qmake

我遇到了很多错误,因为qmake正在不正确地订购我正在使用的boost库。

这是.pro文件的样子

QT       += core gui

TARGET = MyTarget
TEMPLATE = app

CONFIG += no_keywords \
          link_pkgconfig

SOURCES += file1.cpp \
           file2.cpp \
           file3.cpp

PKGCONFIG += my_package \
             sqlite3

LIBS += -lsqlite3 \
        -lboost_signals \
        -lboost_date_time

HEADERS += file1.h\
           file2.h\
           file3.h


FORMS += mainwindow.ui

RESOURCES += Resources/resources.qrc

这会产生以下命令:

g++ -Wl,-O1 -o MyTarget file1.o file2.o file3.o moc_mainwindow.o -L/usr/lib/x86_64-linux-gnu -lboost_signals -lboost_date_time -L/usr/local/lib -lmylib1 -lmylib2 -lsqlite3 -lQtGui -lQtCore

注意:mylib1和mylib2由另一个项目静态编译,放在/ usr / local / lib中,并指向相应的pkg-config .pc文件。 .pro文件通过my_package中的PKGCONFIG引用它们。问题不在于pkg-config的输出,而在于Qt的排序。

这是.pc文件:

prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: my_package
Description: My component package
Version: 0.1
URL: http://example.com
Libs: -L${libdir} -lmylib1 -lmylib2
Cflags: -I${includedir}/my_package/

由于mylib1和mylib2提出了大量未定义的引用,以及app和mylib1和mylib2正在使用的库,因此链接阶段失败了。

我们有另一种使用scons的构建方法,它为链接器正确地命令。它的构建命令顺序如下。

g++ -o MyTarget file1.o file2.o file3.o moc_mainwindow.o -L/usr/local/lib -lmylib1 -lmylib2 -lsqlite3 -lboost_signals -lboost_date_time -lQtGui -lQtCore

请注意,主要区别在于升压库的顺序。 Scons将它们放在QtGui和QtCore之前,而qmake将它们放在第一位。编译命令中的其他差异并不重要,因为我手动修改了生成的qmake文件,简单的重新排序修复了问题。

所以我的问题是,我如何在我的.pro文件中强制执行正确的命令,尽管qmake认为它应该是什么?

1 个答案:

答案 0 :(得分:2)

mylib1,mylib2的.pc文件可能不完整。

如果这些库依赖于-lboost_date_time-lboost_signals,则.pc文件应该已经通过以下方式引入这些依赖项:

Libs: -lboost_date_time -lboost_signals

...并且qmake会将它们放在链接行中的正确位置。无需将它们明确地放在.pro文件中:)