将静态boost_filesystem库与Qt Creator链接时出错

时间:2013-11-22 22:06:27

标签: qt boost mingw qt-creator qmake

我在尝试将静态boost_filesystem库与QMake链接时遇到错误。

我知道我的boost安装工作正常,因为我可以在QMake之外链接到它没有问题:

g++ -o my_file my_file.cpp -IC:\boost_1_55_0\boost_1_55_0 -LC:\boost_1_55_0\boost_1_55_0\stage\lib -lboost_system -lboost_filesystem

我最初尝试将Qt与boost_filesystem链接起来,但似乎无法找到这些库:

LIBS += -LC:\boost_1_55_0\boost_1_55_0\stage\lib -lboost_system -lboost_filesystem
"-lboost_system not found -lboost_filesystem not found"

我在阅读有关如何在使用QMake时指定静态库的绝对路径的内容时,所以我将.pro中的LIBS行更改为以下内容:

LIBS += "C:\boost_1_55_0\boost_1_55_0\stage\lib\libboost_system-mgw48-mt-1_55.a" \
"C:\boost_1_55_0\boost_1_55_0\stage\lib\libboost_filesystem-mgw48-mt-1_55.a"

使用此方法找到库,但是我收到以下错误消息:

     undefined reference to boost::system::generic_category()

我的印象是只有当boost_system没有链接时才会发生此错误!我似乎已经链接了,因为它为它找到了合适的库,我知道我的boost的安装很好,因为相同的库在Qt Creator之外链接很好(使用相同的编译器)。

这是mainwindow.h中的include:

 include <boost/filesystem.hpp>

这里是完整的.pro:

QT       += core gui
QT       += network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

QMAKE_CXXFLAGS += -std=c++11

TARGET = Downloader
TEMPLATE = app

INCLUDEPATH += C:\boost_1_55_0\boost_1_55_0
LIBS += "C:\boost_1_55_0\boost_1_55_0\stage\lib\libboost_system-mgw48-mt-1_55.a" \
    "C:\boost_1_55_0\boost_1_55_0\stage\lib\libboost_filesystem-mgw48-mt-1_55.a"

SOURCES += main.cpp\
    mainwindow.cpp\
    rar_process.cpp\

HEADERS  += mainwindow.h\
        rar_process.h\

FORMS    += mainwindow.ui

RESOURCES += \
    graphics.qrc

这是完整的编译器输出:

C:\Qt\Qt5.1.1\5.1.1\mingw48_32\bin\qmake.exe -spec win32-g++ -o Makefile ..\qt- downloader\Downloader.pro
C:/Qt/Qt5.1.1/Tools/mingw48_32/bin/mingw32-make -f Makefile.Release
mingw32-make[1]: Entering directory 'C:/Users/Patrick/Desktop/cpp/build-Downloader- Desktop_Qt_5_1_1_MinGW_32bit-Release'
g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o release\Downloader.exe release/main.o  release/mainwindow.o release/rar_process.o release/qrc_graphics.o release/moc_mainwindow.o  release/moc_rar_process.o  -lglu32 -lopengl32 -lgdi32 -luser32 -lmingw32 -lqtmain   C:\boost_1_55_0\boost_1_55_0\stage\lib\libboost_system-mgw48-mt-1_55.a   C:\boost_1_55_0\boost_1_55_0\stage\lib\libboost_filesystem-mgw48-mt-1_55.a - LC:\Qt\Qt5.1.1\5.1.1\mingw48_32\lib -lQt5Widgets -lQt5Network -lQt5Gui -lQt5Core 
release/main.o:main.cpp:(.text.startup+0x1a): undefined reference to  `boost::system::generic_category()'
release/main.o:main.cpp:(.text.startup+0x24): undefined reference to  `boost::system::generic_category()'
Makefile.Release:86: recipe for target 'release\Downloader.exe' failed
c:/qt/qt5.1.1/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-    w64-mingw32/bin/ld.exe: release/main.o: bad reloc address 0x24 in section `.text.startup'
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [release\Downloader.exe] Error 1
mingw32-make[1]: Leaving directory 'C:/Users/Patrick/Desktop/cpp/build-Downloader- Desktop_Qt_5_1_1_MinGW_32bit-Release'
makefile:34: recipe for target 'release' failed

2 个答案:

答案 0 :(得分:3)

GCC对链接阶段指定库的顺序非常敏感。例如,如果libA.a取决于libB.a而可执行文件App取决于两者,那么您必须以下列方式调用链接器:

gcc main.o object1.o ... object2.o -lA -lB -o App

这意味着您必须将其更改为:

LIBS += "C:\boost_1_55_0\boost_1_55_0\stage\lib\libboost_filesystem-mgw48-mt-1_55.a" \
        "C:\boost_1_55_0\boost_1_55_0\stage\lib\libboost_system-mgw48-mt-1_55.a"

要跨平台,建议您使构建更加健壮:

Boost_VERSION = 1_55
COMPILER      = mgw48

win32-g++* {
  LIBS           += $$(Boost_DIR)/stage/lib/libboost_filesystem-$${COMPILER}-mt-$${Boost_VERSION}.a \
                    $$(Boost_DIR)/stage/lib/libboost_system-$${COMPILER}-mt-$${Boost_VERSION}.a
  PRE_TARGETDEPS += $$(Boost_DIR)/stage/lib/libboost_filesystem-$${COMPILER}-mt-$${Boost_VERSION}.a \
                    $$(Boost_DIR)/stage/lib/libboost_system-$${COMPILER}-mt-$${Boost_VERSION}.a
}

linux-g++* {
  LIBS           += -L$$(Boost_DIR)/stage/lib -lboost_filesystem-$${COMPILER}-mt-$${Boost_VERSION} \
                                              -lboost_system-$${COMPILER}-mt-$${Boost_VERSION}
  PRE_TARGETDEPS += $$(Boost_DIR)/stage/lib/libboost_filesystem-$${COMPILER}-mt-$${Boost_VERSION}.a \
                    $$(Boost_DIR)/stage/lib/libboost_system-$${COMPILER}-mt-$${Boost_VERSION}.a
}

注意: Boost_DIR在此处将被视为环境变量。这样您就可以在任何系统上灵活地构建它,而无需将依赖于系统的路径硬编码为Boost。这是专业软件开发中的一般做法:尝试在构建系统中尽可能少地进行硬编码,无论它是什么。此外,甚至使Boost_VERSION环境变量也是合理的。所有你必须改变的是括号括号,即$${Boost_VERSION}$$(Boost_VERSION)

最后,请注意我使用正斜杠/作为Windows和Linux的路径分隔符。向后斜杠\不仅在QMake中被弃用,而且一般也不鼓励它。再一次,跨平台:只需让QMake处理转换。

答案 1 :(得分:1)

如果使用mingw gcc 4.8.1构建,显然boost-system不会链接到mingw gcc 4.8.0。

我使用mingw gcc 4.8.0重新构建了boost并与这些lib相关联,现在它可以工作了!