代码之家  ›  专栏  ›  技术社区  ›  kutschkem

CMake中CUDA库的链接

  •  6
  • kutschkem  · 技术社区  · 8 年前

    我正在使用CMake 3.10,在将已编译的库链接到CMake中的测试可执行文件时遇到问题。 我搜索了很多,发现在早期版本中存在一个问题,即无法在结果可执行文件中链接中间库。我无法判断这是否已解决或仍然是一个问题。

    我的CMake文件如下所示:

    算法:

    cmake_minimum_required (VERSION 3.9)
    project(${MODULE_NAME}_core LANGUAGES CXX CUDA)
    
    
    add_subdirectory("${core_impl_dir}" implementation)
    
    
    set(cuda_src "parallel/ParallelComputation.cu")
    set(cuda_hdr "parallel/ParallelComputation.h")
    
    add_library(${PROJECT_NAME} STATIC "${cuda_src}" "${cuda_hdr}"
    )
    
    
    target_include_directories (${PROJECT_NAME} PUBLIC "include/" 
    "parallel/"
    )
    
    source_group("parallel"  FILES "${cuda_src}" "${cuda_hdr}")
    
    
    set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${MODULE_NAME})
    

    测试:

    project(${MODULE_NAME}_gtest LANGUAGES CXX CUDA)
    
    add_subdirectory("${gtest_impl_dir}" implementation)
    
    add_executable(${PROJECT_NAME} "${gtest_impl_src}")
    target_link_libraries(${PROJECT_NAME} ${MODULE_NAME}_core)
    
    enable_testing()
    find_package(GTest REQUIRED)
    include_directories("${GTEST_INCLUDE_DIRS}")
    
    
    target_link_libraries(${PROJECT_NAME} ${GTEST_BOTH_LIBRARIES})
    
    source_group("Implementation\\Source Files" FILES "${gtest_impl_src}" )
    
    set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${MODULE_NAME})
    
    add_test(${PROJECT_NAME} ${PROJECT_NAME})
    

    构建Algo很好,但在构建测试时,我会遇到链接错误,例如

    ../实现/libmatrix1\u testCuda\u核心。a(parallelcompulation.cu.o):在函数“cudaError cudaMalloc(float**,unsigned long)”中: tmpxft\U 00005ad0\U00000000-5\U并行计算。cudafe1.cpp:(.text+0x4f2):未定义的引用“cudaMalloc”

    编辑 使用 make VERBOSE=1 我得到了这个链接命令:

    /usr/bin/c++-Wl,--无需-pthread-g-std=c++14-墙
    CMakeFiles/matrix1\U testCuda\U gtest。目录//tests/eclipseProject/algos/testCuda/test/src/main。cpp。o CMakeFiles/matrix1\U testCuda\U gtest。目录/cmake\u device\u链接。o-o matrix1\u testCuda\u gtest/实现/libmatrix1\u testCuda\u核心。一 /usr/lib/libgtest。a/usr/lib/libgtest\u main。一

    2 回复  |  直到 8 年前
        1
  •  11
  •   kutschkem    8 年前

    我打电话来的

    find_package(CUDA 9.0 REQUIRED)
    

    在两个CMake文件中。 此外,在Algo文件(包含设备代码)中,我必须

    target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})
    

    我原以为CUDA的语言支持会使这些步骤变得不必要,但显然不是。

        2
  •  6
  •   Pat Lorton    6 年前

    我遇到了与此非常相似的问题,根本问题是我的大部分二进制文件都是用系统cxx编译器编译的,而cuda位是用cuda gcc编译器编译的(系统为9.1,cuda为8.3)。

    令人惊讶的是,它通过更改以下内容得以修复:

    project(MyProject LANGUAGES CXX CUDA)

    project(MyProject LANGUAGES CUDA CXX)

    在那次更改之后,CMake选择了gcc编译器的cuda版本作为主编译器,我的二进制代码再次开始构建。我不确定这是否会给其他包带来问题,但它修复了我遇到的链接问题。