我遇到了很多错误,因为 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
in引用它们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 提出了许多未定义的引用来提升应用程序和 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
请注意,主要区别在于 boost 库的顺序。Scons 将它们放在 QtGui 和 QtCore 之前的最后,而 qmake 将它们放在首位。编译命令中的其他差异并不重要,因为我手动修改了 qmake 生成的 make 文件,并且简单的重新排序解决了问题。
所以我的问题是,我如何在我的 .pro 文件中强制执行正确的顺序,尽管 qmake 认为它们应该是什么?