我使用的是 Visual Studio 2013、Windows 10、CMake 3.5.1。
一切都可以使用标准 C++ 正确编译,例如:
CMakeLists.txt
project(Test)
add_definitions(/D "WINDOWS_DLL_API=__declspec(dllexport)")
add_definitions(/D "FOO=1")
set(PROJECT_SRCS ${PROJECT_SOURCE_DIR}/src/Test.cpp)
set(PROJECT_INCS ${PROJECT_SOURCE_DIR}/include/Test.h)
include_directories(${PROJECT_SOURCE_DIR}/include)
add_library(${PROJECT_NAME} SHARED ${PROJECT_SRCS} ${PROJECT_INCS})
Test.h
class WINDOWS_DLL_API Test{
public:
Test();
};
Test.cpp
#include "Test.h"
Test::Test(){
int a = 0;
if (FOO) a++;
}
然而,简单地更改 CMakeLists 以使用 CUDA NVCC 编译完全相同的代码会导致“标识符 FOO 和 WINDOWS_DLL_API 未定义”:
project(Test)
add_definitions(/D "WINDOWS_DLL_API=__declspec(dllexport)")
add_definitions(/D "FOO=1")
set(PROJECT_SRCS ${PROJECT_SOURCE_DIR}/src/Test.cu)
set(PROJECT_INCS ${PROJECT_SOURCE_DIR}/include/Test.cuh)
include_directories(${PROJECT_SOURCE_DIR}/include)
find_package( CUDA REQUIRED )
cuda_add_library(${PROJECT_NAME} SHARED ${PROJECT_SRCS} ${PROJECT_INCS})
花了一些时间谷歌搜索后,我得到的最接近的是更改 add_definitions 的语法,如下所示,它适用于“FOO”,但不适用于“WINDOWS_DLL_API”。错误消息是“nvcc fatal:指定输出文件时,非链接阶段需要单个输入文件”。请注意,如果将此语法应用于标准 C++,则会发生错误。
project(Test)
add_definitions("-DWINDOWS_DLL_API=__declspec(dllexport)")
add_definitions("-DFOO=1")
set(PROJECT_SRCS ${PROJECT_SOURCE_DIR}/src/Test.cu)
set(PROJECT_INCS ${PROJECT_SOURCE_DIR}/include/Test.cuh)
include_directories(${PROJECT_SOURCE_DIR}/include)
find_package( CUDA REQUIRED )
cuda_add_library(${PROJECT_NAME} SHARED ${PROJECT_SRCS} ${PROJECT_INCS})
我还验证了,如果没有在 CMake 中指定定义,即使使用 CUDA NVCC,所有内容也能编译,如下所示:
Test.h
#define WINDOWS_DLL_API __declspec(dllexport)
class WINDOWS_DLL_API Test{
public:
Test();
};
Test.cpp
#include "Test.h"
#define FOO 1
Test::Test(){
int a = 0;
if (FOO) a++;
}
如何使用 CMake 为 cuda 源代码指定宏(特别是 __declspec(dllexport))?