Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何强制qmake库依赖项的顺序?_Qt_Qmake - Fatal编程技术网

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

Qt 如何强制qmake库依赖项的顺序?,qt,qmake,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

我收到了很多错误,因为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文件通过
PKGCONFIG
中的
my_package
引用它们。问题不在于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都在使用的库

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

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 libs的顺序。Scons将它们放在QtGui和QtCore之前的末尾,而qmake将它们放在第一位。编译命令中的其他差异并不重要,因为我已经手工修改了qmake生成的make文件,简单的重新排序修复了这个问题

因此,我的问题是,无论qmake认为.pro文件应该是什么,我如何在.pro文件中执行正确的顺序?

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

如果这些库依赖于
-lboost\u date\u time
-lboost\u signals
,则.pc文件应该已经通过以下方式拉入这些依赖项:

Libs: -lboost_date_time -lboost_signals

…qmake将把它们放在连接线上的正确位置。无需显式地将它们放在.pro文件中:)

mylib[12]的.pc文件是否包含
Libs:-lboost\u date\u time-lboost\u signals
?不,它们没有,但确实有效!非常感谢。请将此作为答复提交,以便我可以接受。