首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用CMake编译c++与CUDA代码

使用CMake编译c++与CUDA代码
EN

Stack Overflow用户
提问于 2020-06-01 19:39:15
回答 1查看 5.6K关注 0票数 6

我正在尝试在使用C++的现有CMake项目中添加CUDA功能。

例如,main.cpp如下所示:

代码语言:javascript
运行
复制
#include <stdio.h>
#include "kernels/test.cuh"

int main() {
  wrap_test_print();
  return 0;
}

kernels/test.cu看起来像:

代码语言:javascript
运行
复制
#include "test.cuh"
__global__ void test_print(){
  printf("Hello World!\n");
}

void wrap_test_print() {
  test_print<<<1, 1>>>();
  return;
}

kernels/test.cuh看起来像:

代码语言:javascript
运行
复制
#ifndef TEST_CUH__
#define TEST_CUH__

#include <stdio.h>

void wrap_test_print();

#endif

我为CMakeLists.txt使用了以下代码

代码语言:javascript
运行
复制
===============
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时,会打印以下错误消息:

代码语言:javascript
运行
复制
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"),但无法解决这个问题。我怎样才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-02 01:06:37

把我的评论变成一个回答:

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

代码语言:javascript
运行
复制
# Initialize for C and C++ languages.
project(cmake_and_cuda)

您通常应该将第一个project()命令直接放在cmake_minimum_required()调用之后,以避免此类错误。enable_language()是一个轻量级的调用,通常用于在以后的CMake项目中启用更多语言。因此,您应该重新安排您的CMake文件,将enable_language()调用放在project()调用之后,以便CMake正确地初始化其内部变量。

代码语言:javascript
运行
复制
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)

或者,只需在CMake命令本身中启用project()项目所需的所有语言:

代码语言:javascript
运行
复制
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()

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62139760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档