我遇到了很多错误,因为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认为它应该是什么?
答案 0 :(得分:2)
mylib1,mylib2的.pc文件可能不完整。
如果这些库依赖于-lboost_date_time
和-lboost_signals
,则.pc文件应该已经通过以下方式引入这些依赖项:
Libs: -lboost_date_time -lboost_signals
...并且qmake会将它们放在链接行中的正确位置。无需将它们明确地放在.pro文件中:)