C++ 将CUDA添加到ROS包中

C++ 将CUDA添加到ROS包中,c++,cuda,static-libraries,linker-errors,ros,C++,Cuda,Static Libraries,Linker Errors,Ros,我想在ros包中使用cuda。有人给我举个简单的例子吗 我试图用cuda函数构建一个静态库,并将这个库添加到我的包中,但我总是遇到一个链接错误:未定义的引用cuda 我构建了一个可执行文件,而不是库,并且它可以工作 请帮忙 我自己找到了一个解决方案: CMakeLists.txt: cmake_minimum_required(VERSION 2.8.3) PROJECT (beginner_tutorials) FIND_PACKAGE(CUDA REQUIRED) find_package

我想在ros包中使用cuda。有人给我举个简单的例子吗

我试图用cuda函数构建一个静态库,并将这个库添加到我的包中,但我总是遇到一个链接错误:未定义的引用cuda

我构建了一个可执行文件,而不是库,并且它可以工作


请帮忙

我自己找到了一个解决方案:

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3)
PROJECT (beginner_tutorials)
FIND_PACKAGE(CUDA REQUIRED)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

SET(CUDA_NVCC_FLAGS "-arch=sm_13" CACHE STRING "nvcc flags" FORCE)
SET (CUDA_VERBOSE_BUILD ON CACHE BOOL "nvcc verbose" FORCE)
SET(LIB_TYPE STATIC) 
CUDA_ADD_LIBRARY(TestLib ${LIB_TYPE} src/helloWorld.cu)

catkin_package(
)
include_directories(
  ${catkin_INCLUDE_DIRS}
)

ADD_EXECUTABLE(beginner_tutorials_node src/main.cpp)
ADD_DEPENDENCIES(beginner_tutorials_node TestLib)
TARGET_LINK_LIBRARIES(beginner_tutorials_node
   ${catkin_LIBRARIES}
   ${PCL_LIBRARIES}
   TestLib
)
cmake_minimum_required(VERSION 2.8.3)
project(cuda_test)
set(CMAKE_CUDA_COMPILER  /usr/local/cuda-9.1/bin/nvcc)

find_package(catkin_simple REQUIRED)
find_package(CUDA REQUIRED)

catkin_simple()

#Here you can set any ncvv compiler flags, if you so wish
#SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -DMY_DEF=1")

#Here you can set any gcc/cmake compiler flags, if you so wish
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3")

#Add all of your sources here
cuda_add_executable(
  cuda_test_cu
  src/hello.cu
)

#Link the executable to the necessary libs
target_link_libraries(
   cuda_test_cu
   ${catkin_LIBRARIES}
   ${CUDA_LIBRARIES}
)

# CMake Indexing
FILE(GLOB_RECURSE LibFiles "include/*")
add_custom_target(headers SOURCES ${LibFiles})

cs_install()
main.cpp:

int testmain();

int main()
{
testmain();
return 0;
}
helloWorld.cu:

#include <stdio.h>

#include <cuda.h>
#include <cuda_runtime.h>

const int N = 7;
const int blocksize = 7;

__global__
void hello(char *a, int *b)
{
  a[threadIdx.x] += b[threadIdx.x];
}

int testmain()
{
  char a[N] = "Hello ";
  int b[N] = {15, 10, 6, 0, -11, 1, 0};

  char *ad;
  int *bd;
  const int csize = N*sizeof(char);
  const int isize = N*sizeof(int);

  printf("%s", a);

  cudaMalloc( (void**)&ad, csize );
  cudaMalloc( (void**)&bd, isize );
  cudaMemcpy( ad, a, csize, cudaMemcpyHostToDevice );
  cudaMemcpy( bd, b, isize, cudaMemcpyHostToDevice );

  dim3 dimBlock( blocksize, 1 );
  dim3 dimGrid( 1, 1 );
  hello<<<dimGrid, dimBlock>>>(ad, bd);
  cudaMemcpy( a, ad, csize, cudaMemcpyDeviceToHost );
  cudaFree( ad );

  printf("%s\n", a);
  return EXIT_SUCCESS;
}
#包括
#包括
#包括
常数int N=7;
const int blocksize=7;
__全球的__
void hello(char*a,int*b)
{
a[threadIdx.x]+=b[threadIdx.x];
}
int testmain()
{
字符a[N]=“你好”;
intb[N]={15,10,6,0,-11,1,0};
char*ad;
int*bd;
常量int csize=N*sizeof(字符);
常数int isize=N*sizeof(int);
printf(“%s”,a);
Cudamaloc((无效**)和ad、csize);
Cudamaloc((void**)和bd、isize);
cudaMemcpy(ad、a、csize、cudaMemcpyHostToDevice);
cudaMemcpy(bd、b、isize、cudaMemcpyHostToDevice);
dim3 dimBlock(块大小,1);
dim3 dimGrid(1,1);
你好(广告,bd);
cudaMemcpy(a、ad、csize、cudaMemcpyDeviceToHost);
库达弗里(公元);
printf(“%s\n”,a);
返回退出成功;
}

如果您使用catkin simple制作您的CMake文件,您可以使用以下CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3)
PROJECT (beginner_tutorials)
FIND_PACKAGE(CUDA REQUIRED)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

SET(CUDA_NVCC_FLAGS "-arch=sm_13" CACHE STRING "nvcc flags" FORCE)
SET (CUDA_VERBOSE_BUILD ON CACHE BOOL "nvcc verbose" FORCE)
SET(LIB_TYPE STATIC) 
CUDA_ADD_LIBRARY(TestLib ${LIB_TYPE} src/helloWorld.cu)

catkin_package(
)
include_directories(
  ${catkin_INCLUDE_DIRS}
)

ADD_EXECUTABLE(beginner_tutorials_node src/main.cpp)
ADD_DEPENDENCIES(beginner_tutorials_node TestLib)
TARGET_LINK_LIBRARIES(beginner_tutorials_node
   ${catkin_LIBRARIES}
   ${PCL_LIBRARIES}
   TestLib
)
cmake_minimum_required(VERSION 2.8.3)
project(cuda_test)
set(CMAKE_CUDA_COMPILER  /usr/local/cuda-9.1/bin/nvcc)

find_package(catkin_simple REQUIRED)
find_package(CUDA REQUIRED)

catkin_simple()

#Here you can set any ncvv compiler flags, if you so wish
#SET(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -DMY_DEF=1")

#Here you can set any gcc/cmake compiler flags, if you so wish
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3")

#Add all of your sources here
cuda_add_executable(
  cuda_test_cu
  src/hello.cu
)

#Link the executable to the necessary libs
target_link_libraries(
   cuda_test_cu
   ${catkin_LIBRARIES}
   ${CUDA_LIBRARIES}
)

# CMake Indexing
FILE(GLOB_RECURSE LibFiles "include/*")
add_custom_target(headers SOURCES ${LibFiles})

cs_install()

我使用它,发现它工作得很好。

这意味着您需要链接到cuda库。如果你发布了你所做的特定步骤和编译器/链接器输出消息,人们将能够帮助你更好地帮助其他遇到困难的人:它与共享库一样有效,只需替换