【问题标题】:Link with a boost library fails when compiling with CUDA nvcc, succeeds with gcc使用 CUDA nvcc 编译时与 boost 库的链接失败,使用 gcc 成功
【发布时间】:2016-02-27 10:11:32
【问题描述】:

我正在尝试仅从以下代码构建可执行文件(假设它在文件kt.cu 中):

#include <boost/program_options.hpp>
int main(int argc, char** argv) 
{
    boost::program_options::options_description options("Options");
    return 0;
}

这里有 4 种可能的构建方法,所有方法都应该可以工作并生成没有链接器错误的二进制文件:

  1. 用 CUDA nvcc 编译,用 CUDA nvcc 链接
  2. 用 CUDA nvcc 编译,用 g++ 链接
  3. 用g++编译,用CUDA nvcc链接
  4. 用g++编译,用g++链接

相关编译链接命令:

  • 使用 CUDA nvcc 编译:

    nvcc -std=c++11 -c kt.cu
    
  • 用 g++ 编译(强制它编译为 .cpp 文件会):

    g++ -x c++ -std=c++11 -c kt.cu 
    
  • 与 CUDA nvcc 的链接:

    nvcc -o kt -lboost_program_options -lcudart -L/usr/local/cuda/lib64 kt.o
    
  • 与 g++ 的链接:

    g++ -o kt -rdynamic -lboost_program_options -lcudart  -L/usr/local/cuda/lib64 kt.o
    

如果我使用 g++ 编译,无论我选择哪个链接器,链接都有效(即选项 3 和 4 有效)。如果我使用 nvcc 编译,无论我选择什么链接器,链接都会失败(即选项 1 和 2 失败)

这是我收到的错误消息:

tmpxft_00003de6_00000000-4_kt.cudafe1.cpp:(.text+0x76): undefined reference to `boost::program_options::options_description::options_description(std::string const&, unsigned int, unsigned int)'
collect2: error: ld returned 1 exit status

为什么会失败?我应该怎么做才能解决/解决这个问题?

注意事项:

  • 我正在使用带有常规 apt-get dist-upgrades 的 Debian 拉伸。
  • 我不认为 boost::program_options 有什么特别之处,即当我也使用其他 boost 库时,它也会发生。它可能也不是特定于提升的,虽然我不能说。
  • 版本(我认为这无关紧要):CUDA 7.5、Boost 1.58、g++4.9.3。还尝试了具有相同效果的 g++ 4.8.5。还尝试仅使用 g++ 5.2.1 进行编译和链接,效果也很好。
  • 编辑:我可以确认这不会发生在 Fedora 20、g++ 4.8.3、Boost 1.54、CUDA 7.5 上。可以是 Boost 版本吗?

【问题讨论】:

  • 据我所知,您为使用 g++ 构建该文件而显示的命令只是重复的编译命令 - 我在任何地方都看不到链接步骤。无论如何,我在 Fedora 20、boost 1.54、CUDA 7.5、gnu 4.8.3 上编译和链接代码与像 this 这样的 nvcc 没有问题。 This 也有效,用 nvcc 编译并用 g++ 链接。
  • @RobertCrovella:查看我的编辑。

标签: c++ cuda dynamic-linking nvcc boost-program-options


【解决方案1】:

这是与 gcc 5 作为链接器的增强不兼容。见here。降级到 gcc 4 或等待补丁。

【讨论】:

    猜你喜欢
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 2011-12-29
    相关资源
    最近更新 更多