在Ubuntu x64上链接Boost

时间:2016-04-19 11:26:51

标签: c++ gcc boost linker

在阅读了很多有关此事的SO问题之后,我无法让它发挥作用。我下载了boost_1_60_0,然后运行命令来构建它:

sudo ./bootstrp.sh --prefix=/home/ricardo/boostlib
sudo ./b2 install -j8

我甚至试过像这样运行b2

sudo ./b2 install -j8 architecture=x86 address-model=64 

没关系。错误总是一样的:

main.cpp:(.text+0x7e): undefined reference to `boost::system::generic_category()'
main.cpp:(.text+0x8a): undefined reference to `boost::system::generic_category()'
main.cpp:(.text+0x96): undefined reference to `boost::system::system_category()'
是的,我知道。链接错误应该与-lboost_system一起运行。是的,你应该放-L/home/ricardo/boostlib/lib。我知道。

这就是我的CMake的样子:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -L/home/ricardo/boostlib/lib -lboost_system -Wl,--verbose")

include_directories("/home/ricardo/boostlib/include")

您可能会问:-Wl,--verbose的输出是什么?嗯,令人惊讶的是,已找到libboost_system.so:

attempt to open /home/ricardo/boostlib/lib/libboost_system.so succeeded
-lboost_system (/home/ricardo/boostlib/lib/libboost_system.so)

好。图书馆被发现了。我仍在努力寻找一些替代方案,到目前为止似乎没有任何工作。所以,即使我将它与boost连接起来,并且发现了boost_system,程序仍然无法编译,因为......为什么?有人可以解释一下吗?

编辑:How to link C++ program with Boost using CMake似乎正在运作。虽然我仍然想知道为什么我的方法不起作用,当我想使用g ++编译器链接而不需要CMake和Make时,我应该怎么做。我以前能够成功地与Openblas联系,所以我想知道为什么它不能与Boost合作。

Edit2:这是我在运行make VERBOSE=1后获得的g ++命令,现在我可以看到源是在依赖项之后放置的。

 -std=c++11 -L/home/ricardo/boostlib/lib -lboost_system   CMakeFiles/prophet-service.dir/main.cpp.o  -o prophet-service -rdynamic

这是我目前的CMake文件:

cmake_minimum_required(VERSION 3.2)
project(prophet-service)
set(SOURCE_FILES
    main.cpp)
include_directories("/home/ricardo/boostlib/include")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -L/home/ricardo/boostlib/lib -lboost_system")
add_executable(prophet-service ${SOURCE_FILES})

似乎我没有libbost_system.a文件。至少现在我知道我需要.a文件而不是.so文件。

2 个答案:

答案 0 :(得分:1)

您是否以正确的顺序进行链接?在依赖SATISFIES之前需要依赖的东西。

答案 1 :(得分:0)

您需要链接扩展名为.a的库版本,因为链接器需要此扩展名(用于静态库)而不是.so用于共享库(与Windows的dll相同)。

例如,如果我在我的Ubuntu操作系统上搜索libboost_system.a,我会发现以下内容:

frar@Home-PC:~$ locate libboost_system.a
/home/frar/Documents/SVILUPPO/boost_1_59_0/bin.v2/libs/system/build/gcc-4.8/release/link-static/threading-multi/libboost_system.a
/home/frar/Documents/SVILUPPO/boost_1_59_0/stage/lib/libboost_system.a
/usr/lib/x86_64-linux-gnu/libboost_system.a