使用CMake编译带有CUDA代码的C++

8

我正在尝试将CUDA函数添加到使用CMake的现有C++项目中。

例如,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)

然而,当我在项目的build文件夹中使用cmake ..命令时,将会打印以下错误消息:

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

我猜这是由问题引起的,所以我添加了set(CMAKE_CXX_FLAGS”$ {CMAKE_CXX_FLAGS} -lcudart”),但我无法解决这个问题。我该如何解决这个问题?

1个回答

8

将我的评论变成答案:

project() 命令将初始化许多关于您的系统和编译器的 CMake 变量。因此,它设置了您的 CMake 项目将使用的语言。如果在 project() 命令中没有指定任何语言,则默认启用 (CCXX):

# 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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接