2013-11-22 69 views
2

我在尝试将静态boost_filesystem库链接到QMake时出现错误。将静态boost_filesystem库链接到Qt Creator时出错

我知道,我的升压安装工作,因为我可以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 

我试图在第一boost_filesystem这样的链接Qt的,但它似乎找不到库:

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时指定静态库的绝对路径,所以我改变了我的LIBS线在我的.pro以下几点:

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 <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 

回答

1

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

我使用mingw gcc 4.8.0重新构建了boost并链接到这些库,现在它可以工作!

+1

这意味着这两个不同版本的编译器生成的代码之间存在二进制不兼容性。由于二进制兼容性在第三个版本号(修补程序)发生更改时保留,因此可能存在二进制不兼容的唯一原因很可能是因为其中一个版本是SJLJ变体,另一个版本是DWARF或SEH。 –

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 
} 

ñ OTE:Boost_DIR在这里将被视为环境变量。这样你就可以在任何系统上灵活地构建它,而不用硬编码Boost的系统相关路径。这是专业软件开发的一般做法:尽可能少地在您的构建系统中尽可能硬编码,无论它是什么。此外,甚至使得Boost_VERSION环境变量也是合理的。所有你需要改变的地方,都括号括在括号内,即$${Boost_VERSION}$$(Boost_VERSION)

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

+0

感谢您的意见和建议。正如他们所看到的那样,不幸的是,改变链接库的顺序并不能解决问题,并导致完全相同的错误信息。 – sugarmuff

+0

那么,在这种情况下,您的Boost库有些问题。尝试运行'nm libboost_system-mgw48-mt-1_55.a | grep generic_category'并检查这个符号是否存在。 –

+0

Haroogan, 该命令返回结果。这不是升压库的问题,因为记住,我可以链接升压系统和升压文件系统没有问题,像这样的编译器: g ++ myfile -Ipath/to/boost -Lpath/to/boost/libs - lboost_system -lboost_filesystem – sugarmuff