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_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が、アプリと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で生成されたmakeファイルを手動で変更し、単純な並べ替えで問題が修正されたためです。

だから私の質問は、qmakeがどうあるべきかを考えているにもかかわらず、.proファイルで正しい順序を強制するにはどうすればよいですか?

4

1 に答える 1

2

mylib1、mylib2の.pcファイルが不完全である可能性があります。

-lboost_date_timeこれらのライブラリがとに依存している場合-lboost_signals、.pcファイルは次の方法でこれらの依存関係をすでにプルしているはずです。

Libs: -lboost_date_time -lboost_signals

...そしてqmakeはそれらをリンクラインの正しい場所に配置します。それらを.proファイルに明示的に配置する必要はありません:)

于 2012-10-05T03:35:25.377 に答える