1

我遇到了很多错误,因为 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_packagein引用它们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 认为它们应该是什么?

4

1 回答 1

2

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

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

Libs: -lboost_date_time -lboost_signals

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

于 2012-10-05T03:35:25.377 回答