在Cygwin上链接Boost库

时间:2018-08-10 01:48:30

标签: c++ boost g++ cygwin

我已经在这里待了几个小时,所以我来这里寻求帮助。 可以肯定的是,我几乎已经弄清楚了,但是我仍然遇到未定义对boost::system::generic_categoryboost::system::system_category的引用的链接器错误。

我只有一个文件要链接以生成可执行文件。

我首先将其编译为目标文件:

g++ -c main.cpp -I C:/boost/boost_1_61_0

这成功创建了main.o。

我的下一个也是最后一个目标是将其链接到可执行文件。我尝试了与其他文章不同的尝试:

g++ main.o -L C:/boost/boost_1_61_0/stage/lib

g++ main.o -L C:/boost/boost_1_61_0/stage/lib/libboost_system.a

g++ main.o -lboost_system

结果要么告诉我找不到库,要么类似:

main.o:main.cpp:(.text+0x89): undefined reference to `boost::system::generic_category()'
main.o:main.cpp:(.text+0x89): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `boost::system::generic_category()'
main.o:main.cpp:(.text+0x95): undefined reference to `boost::system::generic_category()'
main.o:main.cpp:(.text+0x95): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `boost::system::generic_category()'
main.o:main.cpp:(.text+0xa1): undefined reference to `boost::system::system_category()'
main.o:main.cpp:(.text+0xa1): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `boost::system::system_category()'
main.o:main.cpp:(.text$_ZN5boost11this_thread9sleep_forERKNS_6chrono8durationIlNS_5ratioILl1ELl1000000000EEEEE[_ZN5boost11this_thread9sleep_forERKNS_6chrono8durationIlNS_5ratioILl1ELl1000000000EEEEE]+0x24): undefined reference to `boost::this_thread::hiden::sleep_for(timespec const&)'
main.o:main.cpp:(.text$_ZN5boost11this_thread9sleep_forERKNS_6chrono8durationIlNS_5ratioILl1ELl1000000000EEEEE[_ZN5boost11this_thread9sleep_forERKNS_6chrono8durationIlNS_5ratioILl1ELl1000000000EEEEE]+0x24): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `boost::this_thread::hiden::sleep_for(timespec const&)'
collect2: error: ld returned 1 exit status

我知道我正确构建了boost库,因为在stage / lib目录中还有一个libboost_system.a文件以及许多其他库。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

从查看您尝试过的命令开始。

g++ main.o -L C:/boost/boost_1_61_0/stage/lib

这告诉g++C:/boost/boost_1_61_0/stage/lib目录中查找库。它没有说要引入哪些库,但是一旦完成,g++就会出现在这里。

由于您的代码引用了在boost::system::generic_category中找到的内容(例如boost_system),并且由于您没有告诉链接程序提取该库,因此这些引用最终是未定义的。

g++ main.o -L C:/boost/boost_1_61_0/stage/lib/libboost_system.a

这告诉g++C:/boost/boost_1_61_0/stage/lib/libboost_system.a目录中查找库。由于(大概)不是目录,因此-L标志没有实际作用。

g++ main.o -lboost_system

这告诉g++链接到boost_system库中。虽然链接器知道如何将库名(例如boost_system)转换为相应的文件名(例如libboost_system.a),但没有指示可以在哪里找到该文件。因此,链接器将查找它知道的默认目录。当在该文件中找不到该文件时,g++抱怨找不到该库。


这时,您应该看到需要结合的两部分:告诉链接器插入哪个库以及在哪里找到它。

g++ main.o -lboost_system -L C:/boost/boost_1_61_0/stage/lib