我想在集群上构建我的项目,所以我对环境没有任何影响(即没有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