【发布时间】:2021-01-11 11:49:01
【问题描述】:
我正在尝试从 C++ 程序调用 CUDA 内核。我正在使用 CMake 来管理构建过程。
CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(SeamCarving LANGUAGES CUDA CXX VERSION 0.1.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CUDA_STANDARD_REQUIRED True)
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
file(GLOB CPU_SRC_FILES
"src/*.cpp"
"src/*.h"
)
add_library(MyLibrary STATIC src/Kernels.cu src/Kernels.cuh)
set_target_properties( MyLibrary PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
set(SOURCES ${CPU_SRC_FILES})
add_executable(myProject ${SOURCES})
target_link_libraries( myProject PRIVATE ${MyLibrary} )
target_link_libraries( myProject PRIVATE ${OpenCV_LIBS} )
MyClassA.cpp(该文件通过函数调用.cu文件中的CUDA内核)
#include "MyClassA.h"
MyClassA::MyClassA() : MyClassB()
{
myHelloWorldKernel();
}
MyClassA.h
#include <iostream>
#include <opencv2/opencv.hpp>
#include "MyClassB.h"
#include "Kernels.cuh"
class MyClassA : public MyClassB
{
public:
MyClassA();
};
内核.cuh
#ifndef MY_KERNEL_H
#define MY_KERNEL_H
void myHelloWorldKernel();
#endif
内核.cu
#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include "Kernels.cuh"
__global__ void helloWorld() {
printf("Hello!\n");
}
void myHelloWorldKernel()
{
dim3 block(2, 2);
dim3 grid(3, 3);
helloWorld<<<grid, block>>>();
cudaDeviceSynchronize();
printf("Completed!\n");
}
这是我在尝试构建时从 CMake 得到的以下错误:
...
[build] [ 87%] Linking CUDA static library libMyLibrary.a
[build] [ 87%] Built target MyLibrary
[build] [100%] Linking CXX executable myProject
[build] CMakeFiles/myProject.dir/src/MyClassA.cpp.o: In function `MyClassA::MyClassA()':
[build] /PATH/src/MyClassA.cpp:5: undefined reference to `myHelloWorldKernel()'
[build] collect2: error: ld returned 1 exit status
...
我不太确定问题出在哪里。任何帮助表示赞赏。
【问题讨论】: