CUDA 5.0 separate compilation of library with cmake
cmake, compilation, cuda
Solution
I finally got it running ;)
In Addition to the answer of @PHD and my comment on it I modified: `set(BUILD_SHARED_LIBS OFF)` in my `CMakeLists.txt` since shared libs are not supported for separate compilation according to the nvcc manually v5.0 page 40.
In addition to that use the latest rev (1223) from the repository instead of rev 1221. I contacted the developer and he fixed some issue blocking this. This revision doesn't set the `nvcc` `-arch=sm_xx` flag correctly, so I added this manually for my project and informed the developer of FindCUDA.cmake. So this might get fixed in the future.
Don't forget to get cmake > 2.8.10 for this to work.
Hope this helps anyone but me ;)
Here is my CMakeLists.txt:
#Required for CUDA-Check
cmake_minimum_required(VERSION 2.8.10)
project(gpulib)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake/cuda" ${CMAKE_MODULE_PATH})
# ============================================
# === Target
# ============================================
file(GLOB_RECURSE gpuacc_SRCS "*.cu")
include_directories(.)
# ---------------------------------------
# Find Cuda
find_package(CUDA REQUIRED)
set(CUDA_ATTACH_VS_BUILD_RULE_TO_CUDA_FILE ON)
set(BUILD_SHARED_LIBS OFF)
set(CUDA_SEPARABLE_COMPILATION ON)
#list(APPEND CUDA_NVCC_FLAGS -arch=sm_20)
set(LIB_NAME "gpuacceleration")
cuda_add_library(${LIB_NAME}
${gpuacc_SRCS}
OPTIONS -DSTUFF="blah blah"
RELEASE -DNDEBUG
DEBUG -g -DDEBUG
)
set(PUBLIC_HEADERS "myheader1.h;myheader2.h")
INSTALL(FILES ${PUBLIC_HEADERS} DESTINATION include)
INSTALL(FILES "${CMAKE_BINARY_DIR}/src/lib${LIB_NAME}.a" DESTINATION lib)
EDIT: this is not working! The problem is that there are undefined references to all cuda functions (eg. cudaMalloc) when linking the generated library when building a executable in the main project.
Still working on it
Problem
The buildtime of my cuda library is increasing and so I thought that separate compilation introduced in CUDA 5.0 might help me. I couldn't figure out how to achieve separate compilation with cmake. I looked into the NVCC documentation and found how to compile device object (using the -dc option) and how to link them (using the -dlink). My attempts to get it running using cmake failed. I'm using cmake 2.8.10.2 and the head of the trunk of the FindCUDA.cmake. I couldn't however find out how to specify which files should be compiled and how to link them into a library. Especially the syntax of the `function(CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS output_file_var cuda_target options object_files source_files) ` is unclear to me because I don't know what the `output_file_var` and the `cuda_target` are. Here the not working results of my attemps: ``` cuda_compile(DEVICEMANAGER_O devicemanager.cu OPTIONS -dc) cuda_compile(BLUB_O blub.cu OPTIONS -dc) CUDA_LINK_SEPARABLE_COMPILATION_OBJECTS(TEST_O gpuacceleration "" DEVICEMANGER_O BLUB_O) set(LIB_TYPE SHARED) #cuda_add_library(gpuacceleration ${LIB_TYPE} #${gpuacc_SRCS} #devicemanager.cu # blub.cu #DEVICEMANAGER_O # TEST_O #) ``` Does anyone know how to compile and link a cuda library using cmake? Thanks in advance. EDIT: After a friend consulted the developer of the FindCUDA.cmake, a bug got fixed in the example provided with FindCUDA.cmake (https://gforge.sci.utah.edu/gf/project/findcuda/scmsvn/?action=browse&path=%2Fcheckout%2Ftrunk%2FFindCuda.html). I'm now able to build the example. In my project I can build the library as needed using the following (cmake 2.8.10 required): ``` set(LIB_TYPE SHARED) set(CUDA_SEPARABLE_COMPILATION ON) cuda_add_library(gpuacceleration ${LIB_TYPE} blub.cu blab.cu ) ``` BUT: I cannot link against this library. When I builded the lib without separate compilation i was able to link against it. Now getting the following error: ``` undefined reference to `__cudaRegisterLinkedBinary_53_tmpxft_00005ab4_00000000_6_blub_cpp1_ii_d07d5695' ``` for every file with a function used in the interface. Seems strange since it builds without any warning etc. Any ideas how to get this working? EDIT: I finally figured out how to do this. See @PHD's and my answer for details.