在 CMake 中链接 CUDA 库
Linking of CUDA library in CMake
我正在使用 CMake 3.10,但在将已编译的库link编译为 CMake 中的测试可执行文件时遇到问题。
我搜索了很多,发现在早期版本中存在无法在结果可执行文件中 link 中间库的问题。我无法判断这是否已解决或仍然是一个问题。
我的 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})
仅构建 Algo 工作正常,但在构建测试时,我遇到 linking 错误,例如
../implementation/libmatrix1_testCuda_core.a(ParallelComputation.cu.o): In Funktion 'cudaError cudaMalloc(float**, unsigned long)':
tmpxft_00005ad0_00000000-5_ParallelComputation.cudafe1.cpp:(.text+0x4f2): Undefined reference 'cudaMalloc'
编辑
使用 make VERBOSE=1
我得到了这个 linking 命令:
/usr/bin/c++ -Wl,--no-as-needed -pthread -g -std=c++14 -Wall
CMakeFiles/matrix1_testCuda_gtest.dir//tests/eclipseProject/algos/testCuda/test/src/main.cpp.o
CMakeFiles/matrix1_testCuda_gtest.dir/cmake_device_link.o -o
matrix1_testCuda_gtest ../implementation/libmatrix1_testCuda_core.a
/usr/lib/libgtest.a /usr/lib/libgtest_main.a
我通过调用
来让它工作
find_package(CUDA 9.0 REQUIRED)
在两个 CMake 文件中。
此外,在 Algo 文件(包含设备代码)中,我必须做
target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})
我原以为 CUDA 的语言支持会使这些步骤变得不必要,但显然不是。
我只是 运行 进入了与此非常相似的东西,其中根本问题是我的大部分二进制文件都是用我的系统 cxx 编译器编译的,而 cuda 位是用 cuda gcc 编译器编译的(系统为 9.1,cuda 为 8.3)。
令人惊讶的是,它通过更改得到修复:
project(MyProject LANGUAGES CXX CUDA)
至
project(MyProject LANGUAGES CUDA CXX)
在那次更改之后,CMake 选择了 gcc 编译器的 cuda 版本作为主要编译器,我的二进制文件又开始构建了。我不确定这是否会给其他包带来问题,但它解决了我遇到的链接问题。
我正在使用 CMake 3.10,但在将已编译的库link编译为 CMake 中的测试可执行文件时遇到问题。 我搜索了很多,发现在早期版本中存在无法在结果可执行文件中 link 中间库的问题。我无法判断这是否已解决或仍然是一个问题。
我的 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})
仅构建 Algo 工作正常,但在构建测试时,我遇到 linking 错误,例如
../implementation/libmatrix1_testCuda_core.a(ParallelComputation.cu.o): In Funktion 'cudaError cudaMalloc(float**, unsigned long)': tmpxft_00005ad0_00000000-5_ParallelComputation.cudafe1.cpp:(.text+0x4f2): Undefined reference 'cudaMalloc'
编辑
使用 make VERBOSE=1
我得到了这个 linking 命令:
/usr/bin/c++ -Wl,--no-as-needed -pthread -g -std=c++14 -Wall
CMakeFiles/matrix1_testCuda_gtest.dir//tests/eclipseProject/algos/testCuda/test/src/main.cpp.o CMakeFiles/matrix1_testCuda_gtest.dir/cmake_device_link.o -o matrix1_testCuda_gtest ../implementation/libmatrix1_testCuda_core.a /usr/lib/libgtest.a /usr/lib/libgtest_main.a
我通过调用
来让它工作find_package(CUDA 9.0 REQUIRED)
在两个 CMake 文件中。 此外,在 Algo 文件(包含设备代码)中,我必须做
target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})
我原以为 CUDA 的语言支持会使这些步骤变得不必要,但显然不是。
我只是 运行 进入了与此非常相似的东西,其中根本问题是我的大部分二进制文件都是用我的系统 cxx 编译器编译的,而 cuda 位是用 cuda gcc 编译器编译的(系统为 9.1,cuda 为 8.3)。
令人惊讶的是,它通过更改得到修复:
project(MyProject LANGUAGES CXX CUDA)
至
project(MyProject LANGUAGES CUDA CXX)
在那次更改之后,CMake 选择了 gcc 编译器的 cuda 版本作为主要编译器,我的二进制文件又开始构建了。我不确定这是否会给其他包带来问题,但它解决了我遇到的链接问题。