【问题标题】:link error when using random_device from boost使用 boost 中的 random_device 时出现链接错误
【发布时间】:2020-07-21 14:02:46
【问题描述】:

我已经使用 brew 在 MacOSX 10.15 boost 上安装了,一切正常,除了 random_device。

这是我写的:

#include <iostream>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/discrete_distribution.hpp>
#include <boost/random/random_device.hpp>

int main() {
    boost::random::random_device rand_dev;
    boost::mt19937 gen(rand_dev());
    double probabilities[]{0, 0.99, 0.01, 0};
    boost::random::discrete_distribution<> dist(probabilities);
    std::cout << dist(gen);

    return 0;
}

这就是我从编译器得到的:

架构 x86_64 的未定义符号:

“boost::random::random_device::random_device()”,引用自: _main 在 main.cpp.o 中

“boost::random::random_device::~random_device()”,引用自: _main 在 main.cpp.o 中

“boost::random::random_device::operator()()”,引用自: _main 在 main.cpp.o 中

ld:未找到架构 x86_64 的符号

clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看 调用)

我正在使用 CMake 链接它。而且我已经在Ubuntu 18 上安装了它并且得到了同样的链接错误。

这是我的 CMake 的一部分:

find_package(Boost 1.72)  

if(Boost_FOUND)
     include_directories(${Boost_INCLUDE_DIRS})
     target_link_libraries(test_boost ${Boost_LIBRARY_DIR}) 
endif()

【问题讨论】:

  • "这是我从编译器得到的:" 这些是链接器的错误,而不是编译器的错误。你是如何链接你的应用程序的?您是否链接了相关的 boost 库?
  • 我正在使用 CMake 链接它。而且我已经将它安装在Ubuntu 18 上并且得到了相同的链接错误。这是我的 CMake 的一部分:find_package(Boost 1.72) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) target_link_libraries(test_boost ${Boost_LIBRARY_DIR}) endif()
  • 回答问题所需的所有信息都必须出现在问题中,而不是在 cmets 中。请edit您的问题添加上述信息。

标签: c++ boost clang++


【解决方案1】:

使用以下代码编辑您的 CMakeLists.txt:

find_package(Boost 1.72 COMPONENTS random)
if(Boost_FOUND) 
    include_directories(${Boost_INCLUDE_DIRS}) 
    target_link_libraries(test_boost ${Boost_LIBRARIES}) 
endif()

【讨论】:

    【解决方案2】:

    将 -lboost_random 作为编译器命令行参数添加到链接器输入:

    g++  -o  test  test.cpp  -lboost_random
    

    【讨论】:

    • 谢谢,它现在正在链接和编译,但只能从终端。也许您知道如何在 CMake 中向链接器添加标志?我已经添加了这样的行 - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lboost_random")
    • @dikiidog 类似target_link_libraries(targetName -lboost_random),其中targetName 是您的CMake 目标的名称。
    • @dikiidog 你可以使用这个模式:target_link_libraries(test boost_random)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2016-02-11
    • 2016-06-13
    • 2012-09-24
    • 2014-01-19
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多