2015-11-24 40 views
0

我試圖建立正好從下面的代碼可執行的成功(說這是文件kt.cu中):鏈接和一個升壓庫出現故障時,用gcc

#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. 鏈接210
  4. 與克編譯++,鏈路與CUDA NVCC
  5. 編譯克++,使用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++ -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 

這是爲什麼失敗?我應該怎麼做才能解決/解決這個問題?

注:

  • 我使用Debian拉伸定期apt-get dist-upgrade秒。
  • 我不認爲boost :: program_options有什麼特別之處,即當我也使用它們時,它會發生在其他boost庫上。這可能不是特定促銷,但我不能說。
  • 版本(這應該不是我想的):CUDA 7.5,Boost 1.58,g ++ 4.9.3。還嘗試過g ++ 4.8.5,效果相同。也嘗試編譯和linmking與g ++ 5.2.1只,也工作。
  • 編輯:我可以確認這是否不是發生在Fedora 20上,其中g ++ 4.8.3,Boost 1.54,CUDA 7.5。它可以是Boost版本的東西嗎?
+2

就我所知,使用g ++構建該文件所顯示的命令只是重複編譯命令 - 我沒有在任何地方看到鏈接步驟。無論如何,在Fedora 20,Fedora 20,boost 1.54,CUDA 7.5,gnu 4.8.3上,我沒有任何編譯和鏈接代碼的麻煩,如[this](http://pastebin.com/Gjvr4ztn)。 [This](http://pastebin.com/p4t6sBNS)也起作用,用nvcc編譯並用g ++連接。 –

+0

@RobertCrovella:看我的編輯。 – einpoklum

回答

1

這是與gcc 5作爲鏈接器的增強不兼容性。見here。降級到gcc 4或等待補丁。

+0

查看我的編輯@ RobertCrovella的評論。 – einpoklum