我正在使用CMake 3.10,在CMake中将编译的库链接到测试可执行文件时遇到问题。我搜索了很多,发现在早期版本中存在一个问题,即无法在结果可执行文件中链接中间库。我无法判断这个问题是否已解决,还是仍然存在。
我的CMake文件看起来像这样:
算法:
cmake_minimum_required (VERSION 3.9)
project(${MODULE_NAME}_core LANGUAGES CXX CUDA)
add_subdirectory("${core_impl_dir}" implementation)
set(cuda_src "parallel/ParallelComputation.cu")
set(cuda_hdr "parallel/ParallelComputation.h")
add_library(${PROJECT_NAME} STATIC "${cuda_src}" "${cuda_hdr}"
)
target_include_directories (${PROJECT_NAME} PUBLIC "include/"
"parallel/"
)
source_group("parallel" FILES "${cuda_src}" "${cuda_hdr}")
set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${MODULE_NAME})
试验:
project(${MODULE_NAME}_gtest LANGUAGES CXX CUDA)
add_subdirectory("${gtest_impl_dir}" implementation)
add_executable(${PROJECT_NAME} "${gtest_impl_src}")
target_link_libraries(${PROJECT_NAME} ${MODULE_NAME}_core)
enable_testing()
find_package(GTest REQUIRED)
include_directories("${GTEST_INCLUDE_DIRS}")
target_link_libraries(${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES})
source_group("Implementation\\Source Files" FILES "${gtest_impl_src}" )
set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${MODULE_NAME})
add_test(${PROJECT_NAME} ${PROJECT_NAME})
BuildingJustAlgo运行良好,但是当同时构建Test时,我会遇到链接错误,例如
../实现/libmatrix1_testCuda_core.a(并行计算.cu.o):在函数“cudaError cudaMalloc(浮点型**,无符号长整型)”中:文件名:(.text+0x 4f 2):未定义的引用'cudaMalloc'
使用make VERBOSE=1
编辑我得到了这个链接命令:
/usr/bin/c++ -壁厚,--非按需-pthread -g -标准品=c++14 -壁厚
CMakeFiles/矩阵1_testCuda_gtest.dir//测试/eclipse项目/算法/testCuda/测试/源代码/主.cpp.o CMakeFiles/矩阵1_testCuda_gtest.dir/cmake设备链接.o -o矩阵1_testCuda_gtest.../实现/libmatrix1_testCuda_core.a/usr/lib/libgtest. a/usr/lib/libgtest_主. a
3条答案
按热度按时间xwbd5t1u1#
我是打电话来让它工作的
此外,在Algo文件(包含设备代码)中,我必须执行以下操作
我原以为对CUDA的语言支持会使那些步骤变得不必要,但显然不是。
piwo6bdm2#
我刚刚遇到了与此非常相似的情况,根本问题是我的大部分二进制文件是用我的system cxx编译器编译的,而cuda位是用cuda gcc编译器编译的(system编译器为9.1,cuda编译器为8.3)。
令人惊讶的是,通过更改以下内容进行了修复:
第一个月
到
project(MyProject LANGUAGES CUDA CXX)
修改之后,CMake选择了cuda版本的gcc编译器作为主编译器,我的二进制文件又开始编译了。我不确定这是否会给其他包带来问题,但它修复了我遇到的链接问题。
gv8xihay3#
在CMake 3.18中添加了可能的方式,并进一步
如果您不希望包含任何CUDA代码,但仅使用来自
C++
的cufft调用,则执行以下操作即可如果您正在启用CUDA支持,除非您想遇到麻烦,否则请在启用CUDA后调用它。
因为CUDAToolkit respects启用了添加的CUDA运行时,但它不工作,反之亦然。