如何解决Visual Studio/CMake
原始问题(标题:.cu 文件在 Visual Studio/CMake 中被处理为 .cpp 文件)
我正在尝试将带有 CUDA 代码的静态库添加到我的 C++ 项目中。我有一个顶级 CMakeLists.txt
文件,一个从那里添加的静态库,以及从该库添加的使用 CUDA 的库(两个库都有自己的 CMakeLists.txt
文件。在根文件中我有使用了 enable_language(CUDA)
,在一级库的 CMakeLists.txt
中我已经这样做了:
add_subdirectory(cuda_library)
set_target_properties(level_1_lib PROPERTIES POSITION_INDEPENDENT_CODE ON)
set_target_properties(level_1_lib PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(level_1_lib cuda_library)
并在 CUDA 库的 CMakeLists.txt
中:
add_library(cuda_library
cuda_library.cu cuda_library.h)
target_include_directories(cuda_library
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)
1 级库中的 .cpp
文件调用我在 cuda_library.h
中声明的“接口函数”,该函数在 cuda_library.cu
中实现并在内部启动一个 CUDA __global__
内核方式:
namespace cuda_library {
__global__
void real_foo(int number,int *out) {
*out = number * 2;
}
inline int foo(int number) {
int* x;
cudaMallocManaged(&x,sizeof(int));
real_foo<<<1,1>>>(number,x);
cudaDeviceSynchronize();
int y = *x;
cudaFree(x);
return y;
}
}
当我从 Visual Studio 构建时(启用了 CMake 扩展,并且它使用 ninja
作为生成器),但是,构建不喜欢 __global__
关键字,让我认为 { {1}} 文件被视为普通的 .cu
文件,而不是编译为 CUDA 代码。
我做错了什么?
编辑以更好地澄清我得到的错误
如果我点击 Visual Studio 的“Build All”(或从 Visual Studio 命令提示符运行带有 ninja 的 CMake,它通常可以用 .cpp
编译简单的 CUDA 示例,错误是相同的),但我不是在 nvcc
文件中,我只得到归结为 cuda_library.cu
的错误,从一些研究来看,这意味着该函数可能已声明但未定义。如果包含标头但未正确编译 unresolved external symbol cuda_library::foo(int)
文件,这很有意义。
但是,只有当我使 .cu
文件处于活动状态时,VS 才会向我显示与像 C++ 代码一样对待的 CUDA 代码相关的错误,并且它们没有正常的错误徽标(如第一个错误这张图片),但您可以在第二张和第三张中看到:
那么它们可能只是构建时没有出现的智能感知错误吗?
在这种情况下,静态库的实现没有正确链接可能还有另一个原因。为了更彻底地了解它,这是标题 (.cu
):
cuda_library.h
并且我尝试在发生 #ifndef _CUDA_LIBRARY_H_
#define _CUDA_LIBRARY_H_
namespace cuda_library {
inline int foo(int number);
}
#endif
错误的 .cpp
文件中以这种方式导入和使用它:
unresolved external symbol cuda_library::foo(int)
有趣的是,我也尝试过
#include "cuda_library/cuda_library.h"
printf("Result from the GPU: %d\n",cuda_library::foo(5));
结果是一样的,也许是因为 CMake 将它包含在包含搜索路径中?
该项目具有以下结构:
#include <cuda_library.h>
我真的不明白到底出了什么问题,所以任何帮助都可以接受。
解决方法
您必须为每个源 cpp 文件添加一个属性,以说明它确实是一个 cuda 源。
set_source_files_properties(file.cpp PROPERTIES LANGUAGE CUDA)
启用 CUDA 作为语言后 (enable_language(CUDA)
)。
我们使用它,但我不知道这是否是一个好的做法(感谢反馈)。
,我意识到有两个主要因素阻碍了它的工作:
- 函数签名中的
inline
似乎自己破坏了它(此时我不太关心我的代码中的它不删除它,如果有人想对其进行更多调查,他们'可以自由地去做)。 -
enable_language(CUDA)
必须位于顶级CMakeLists.txt
文件中。
修复它构建的这两件事没有任何问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。