【问题标题】:CUDA catkin/cmake - undefined reference to `curandCreateGenerator`CUDA catkin/cmake - 对“curandCreateGenerator”的未定义引用
【发布时间】:2021-02-12 09:56:36
【问题描述】:

我在使用 catkin 编译 CUDA 项目时遇到了我认为是链接器错误的问题。源代码的 sn-p 如下。当我尝试运行 catkin build 时出现错误:

error

In function `curand_init(double*, int, int):
./src/cwru_cuda.cu undefined reference to `curandCreateGenerator'
./src/cwru_cuda.cu undefined reference to `curandSetPseudoRandomGeneratorSeed'

我检查了详细的构建输出,它使用 c++ 链接文件,它传递了我在CURAND_FLAGS 中定义的适当标志。我不确定这里还有什么问题?我对构建工具不是很了解。

CURAND reference

cwru_cuda.h

#include <cuda.h>
#include <cuda_runtime.h>
#include <curand.h>
#include <helper_cuda.h>
#include <device_launch_parameters.h>

void curand_init(double*, int, int);

cwru_cuda.cu

#include <cwru_cuda.h>

curandGenerator_t __curand_gen;
double* __curand_float_address;
size_t __curand_float_size;
int __curand_num_elems;

void curand_init(double* address, int numElements, int seed = 1234) {
    curandCreateGenerator(&__curand_gen, CURAND_RNG_PSEUDO_DEFAULT);
    curandSetPseudoRandomGeneratorSeed(__curand_gen, seed);
    __curand_num_elems = numElements;
    __curand_float_size = numElements * sizeof(double);
    cudaMallocManaged(&__curand_float_address, __curand_float_size);
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(cwru_cuda)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)

# https://stackoverflow.com/questions/25748039/add-cuda-to-ros-package

find_package(CUDA REQUIRED) 

# set CUDA_NVCC_FLAGS as you would do with CXX/C FLAGS         
set(CUDA_NVCC_FLAGS CACHE STRING "nvcc flags" FORCE)
set(CUDA_VERBOSE_BUILD ON CACHE BOOL "nvcc verbose" FORCE)
set(CURAND_FLAGS "-lcurand_static -lculibos -lcudart_static -lpthread -ldl -I /usr/local/cuda/include -L /usr/local/cuda/lib64")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CURAND_FLAGS}")
set(LIB_TYPE STATIC) 
cuda_add_library(cuda_vector_lib ${LIB_TYPE} src/cwru_cuda.cu)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES cuda_vector_lib
#  CATKIN_DEPENDS roscpp std_msgs
#  DEPENDS system_lib
)

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

add_executable(cuda_vector_test src/tests.cpp src/Timer.cpp)

add_dependencies(cuda_vector_test cuda_vector_lib)

TARGET_LINK_LIBRARIES(cuda_vector_test
    ${catkin_LIBRARIES}
    cuda_vector_lib
)

使用catkin build cwru_cuda --verbose构建

build output

make[2]: Entering directory '/home/ethan/catkin_ws/build/cwru_cuda'
[ 60%] Linking CXX executable /home/ethan/catkin_ws/devel/.private/cwru_cuda/lib/cwru_cuda/cuda_vector_test
/usr/bin/cmake -E cmake_link_script CMakeFiles/cuda_vector_test.dir/link.txt --verbose=1
/usr/bin/c++   -lcurand_static -lculibos -lcudart_static -lpthread -ldl -I /usr/local/cuda/include -L /usr/local/cuda/lib64  -rdynamic CMakeFiles/cuda_vector_test.dir/src/tests.cpp.o CMakeFiles/cuda_vector_test.dir/src/Timer.cpp.o  -o /home/ethan/catkin_ws/devel/.private/cwru_cuda/lib/cwru_cuda/cuda_vector_test -Wl,-rpath,/opt/ros/melodic/lib /opt/ros/melodic/lib/libroscpp.so -lboost_filesystem /opt/ros/melodic/lib/librosconsole.so /opt/ros/melodic/lib/librosconsole_log4cxx.so /opt/ros/melodic/lib/librosconsole_backend_interface.so -llog4cxx -lboost_regex /opt/ros/melodic/lib/libxmlrpcpp.so /opt/ros/melodic/lib/libroscpp_serialization.so /opt/ros/melodic/lib/librostime.so /opt/ros/melodic/lib/libcpp_common.so -lboost_system -lboost_thread -lboost_chrono -lboost_date_time -lboost_atomic -lpthread /usr/lib/x86_64-linux-gnu/libconsole_bridge.so.0.4 libcuda_vector_lib.a /usr/local/cuda-11.0/lib64/libcudart_static.a -lpthread -ldl -lrt 
libcuda_vector_lib.a(cuda_vector_lib_generated_cwru_cuda.cu.o): In function `curand_init(double*, int, int)':
/home/ethan/catkin_ws/src/cwru_cuda/src/cwru_cuda.cu:23: undefined reference to `curandCreateGenerator'
/home/ethan/catkin_ws/src/cwru_cuda/src/cwru_cuda.cu:24: undefined reference to `curandSetPseudoRandomGeneratorSeed'
libcuda_vector_lib.a(cuda_vector_lib_generated_cwru_cuda.cu.o): In function `generate_uniform_double()':
/home/ethan/catkin_ws/src/cwru_cuda/src/cwru_cuda.cu:31: undefined reference to `curandGenerateUniformDouble'
collect2: error: ld returned 1 exit status
CMakeFiles/cuda_vector_test.dir/build.make:141: recipe for target '/home/ethan/catkin_ws/devel/.private/cwru_cuda/lib/cwru_cuda/cuda_vector_test' failed

【问题讨论】:

  • 如果您发布了实际的构建输出将会很有帮助。显然 curand 库没有被链接。为什么归结为理解make系统发出的构建命令,我们看不到
  • 谢谢,我编辑了问题以显示带有 --verbose 标志的构建输出。编辑:在此之前还有多行输出,但这似乎是相关信息。
  • 根据实际使用的 c++ 编译器工具链,链接器可能不喜欢您首先列出(几个)库,然后是要链接的对象。例如,更高版本的 g++ 希望以从左到右的顺序满足链接依赖关系。鉴于链接器没有抱怨找不到,例如,-lcurand_static(满足依赖关系)我认为这值得研究。
  • 而不是尝试通过CMAKE_CXX_FLAGS 来满足您的CURAND 依赖关系,也许您应该使用here 方法。

标签: c++ cmake cuda ros catkin


【解决方案1】:

Robert Crovella 在上面的comments 中回答了这个问题。

我能够使用target_link_libraries() 设置满足依赖关系的-lcurand-lcublas。所以我将以下行添加到我的 CMakeLists.txt

target_link_libraries(cuda_vector_lib -lcublas -lcurand)

【讨论】:

  • 你不需要-lcublas,除非你真的在使用CUBLAS,但它不会伤害任何东西。
  • 这是一个公平的观点,我实际上在这个项目的其他地方使用它,所以我忘了为了这个答案删除它。
猜你喜欢
  • 2021-01-11
  • 2015-09-14
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2012-10-07
  • 2012-10-14
  • 1970-01-01
相关资源
最近更新 更多