我试图在使用CMake的现有C ++项目中添加CUDA函数。
例如,main.cpp
如下所示:
#include <stdio.h>
#include "kernels/test.cuh"
int main() {
wrap_test_print();
return 0;
}
kernels/test.cu
如下:
#include "test.cuh"
__global__ void test_print(){
printf("Hello World!\n");
}
void wrap_test_print() {
test_print<<<1, 1>>>();
return;
}
kernels/test.cuh
如下:
#ifndef TEST_CUH__
#define TEST_CUH__
#include <stdio.h>
void wrap_test_print();
#endif
我为CMakeLists.txt
使用以下代码:
===============
CMakeLists.txt
===============
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
enable_language(CUDA)
project(cmake_and_cuda)
add_executable(main main.cpp)
add_subdirectory(kernels)
# set_property(TARGET main
# PROPERTY CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(main kernels)
===============
kernels/CMakeLists.txt
===============
enable_language(CUDA)
add_library(kernels
test.cu
test.cuh
)
target_compile_features(kernels PUBLIC cxx_std_11)
set_target_properties(kernels
PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(kernels)
但是,当我在项目的cmake ..
文件夹中使用build
时,将显示以下错误消息:
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_CUDA_DEVICE_LINK_LIBRARY
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_CUDA_DEVICE_LINK_LIBRARY
我猜这是由于cudart
问题引起的,因此我添加了set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lcudart")
,但无法解决此问题。我该如何解决这个问题?
答案 0 :(得分:3)
将我的评论变成答案:
project()
命令将初始化许多与系统和编译器有关的CMake变量。这样,它将设置您的CMake项目将使用的语言。在project()
命令中未指定任何语言的情况下,启用了默认值(C
和CXX
):
# Initialize for C and C++ languages.
project(cmake_and_cuda)
通常应将第一个project()
命令直接放在cmake_minimum_required()
调用之后,以避免此类错误。 enable_language()
是一个轻量级的调用,通常用于稍后在CMake项目中启用更多语言。因此,您应该重新安排CMake文件,以将enable_language()
调用 放在project()
调用之后,以便CMake正确初始化了其内部变量。
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
# Initialize for C and C++ languages.
project(cmake_and_cuda)
# Also, enable CUDA language support.
enable_language(CUDA)
或者,只需在project()
命令本身中启用CMake项目所需的所有语言:
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
# Initialize for C++ and CUDA languages.
project(cmake_and_cuda LANGUAGES CXX CUDA)
注意:enable_language()
和project()
命令的语言适用于它们下面的所有CMake目录,因此无需在子目录中再次调用enable_language()
。