我想在集羣上構建我的項目,所以我對環境沒有任何影響(即沒有sudo)。在我的本地機器上,我可以使它工作。Cmake鏈接多個版本的boost/Cmake獨立編譯的源文件
這裏的問題: 我的項目包含cuda文件以及C++代碼。後者需要一個需要gcc/g ++> 6(也許> 5也可以,afaik std = C++ 14)的庫。另一方面,cuda代碼需要gcc < 5.
我已經通過使用g ++ 6.2.0作爲標準編譯器並通過其他gcc與-ccbin /路徑/到/ GCC-4.x的。
因此,我的代碼編譯得很好,但問題是它也使用boost庫,它需要是羣集上的新版本才能與我在本地使用的gcc 6.2.0一起工作。這也不是問題本身,因爲鏈接正確的工作,但是這樣做時,nvcc仍然鏈接一個較舊版本的boost(這是與gcc-4.x兼容),從而導致有多個提升鏈接庫的版本。在運行時,無論何時使用舊的boost庫的函數,都會導致分段錯誤。
因此,一個解決方案,我在想會是第一個編譯的C++文件,然後只CUDA文件,有點像一個簡單的makefile目標會做:
foo: foo-class.o
nvcc foo-class.o foo.cu -o foo
我目前不能確定這是否會解決問題,如果這可能與cmake有關,但如果情況並非如此,是否有可能關注雙重聯繫?礦山目前的樣子
最小cmake的文件例如:
cmake_minimum_required(VERSION 3.2)
project(foo)
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
set(LINKER_FLAGS "-lboost_program_options -lboost_regex -lSDL2 -lSDL2main -lboost_system -lboost_filesystem")
set(ADDITIONAL_FLAGS "-g -Wno-error=switch")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 ${LINKER_FLAGS} ${ADDITIONAL_FLAGS}")
set(SOURCE_FILES
runtime/main.cpp
foo.cpp)
set(CUDA_FILES cuda/food.cu)
set(CUDA_ADDITIONAL_FLAGS "-ccbin /usr/bin/gcc --Wno-deprecated-gpu-targets")
set(CUDA_SDK_ROOT_DIR "/afs/crc.nd.edu/x86_64_linux/c/cuda/8.0/")
find_package(CUDA QUIET REQUIRED)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
set(CUDA_NVCC_FLAGS -g ${CUDA_ADDITIONAL_FLAGS})
FIND_PACKAGE(Boost COMPONENTS program_options filesystem system regex REQUIRED)
cuda_add_executable(isosurfaces ${SOURCE_FILES} ${CUDA_FILES})
include_directories(~/lib/include)
include_directories(${BOOST_ROOT}/incldue)
target_link_libraries(foo ~/lib/lib/libThorSerialize17.so)
感謝您的幫助,我真的很感激。
也許我錯過了一些在這裏完全明顯的東西,但爲什麼你試圖將任何主機代碼與nvcc連接? – talonmies
有沒有辦法用cmake構建一個可執行文件,它允許使用nvcc編譯一部分,使用gcc/g ++編譯一部分? – mimre