Есть небольшой проектик совсем... так, малюсенький. Написан на C++ с использованием CUDA
Структура такая:
./include/cube.h
./include/integrate.h
./src/cpuintegrate.cpp
./src/cuintegrate.cu
./src/cube.cpp
./src/main.cpp
Использовал он довольно криво написанный Makefile, что меня конечно же не радовало. Мне нужно, например, будет в будущем добавить помимо main.cpp других файлов, которые будут исполнимыми и содержать функцию main, и которые будут использовать те же библиотечные файлы... вот так как-то.
В общем, настряпал я вот такой CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(GpuDensity)
FIND_PACKAGE(CUDA)
set(LINK_FLAGS "-lcurand -lgsl")
INCLUDE_DIRECTORIES(
"include/"
"src/"
"/opt/cuda/include"
)
CUDA_ADD_LIBRARY(cube "src/cube.cpp")
CUDA_ADD_LIBRARY(cpuintegrate "src/cpuintegrate.cpp")
CUDA_ADD_LIBRARY(cuintegrate "src/cuintegrate.cu")
CUDA_ADD_EXECUTABLE(main "src/main.cpp" "include/cube.h" "include/integrate.h")
TARGET_LINK_LIBRARIES(main cube)
TARGET_LINK_LIBRARIES(main cpuintegrate)
TARGET_LINK_LIBRARIES(main cuintegrate)
вроде бы все зависимости указал правильно... надеюсь. cmake отрабатывает нормально, а вот make выводит вот такую ошибку:
libcpuintegrate.a(cpuintegrate.cpp.o): In function `next(gsl_rng const*, float, float)':
cpuintegrate.cpp:(.text+0x56): undefined reference to `gsl_rng_uniform'
libcpuintegrate.a(cpuintegrate.cpp.o): In function `uniform(int, double, double)':
cpuintegrate.cpp:(.text+0x8f): undefined reference to `gsl_rng_default'
cpuintegrate.cpp:(.text+0x97): undefined reference to `gsl_rng_alloc'
cpuintegrate.cpp:(.text+0xad): undefined reference to `gsl_rng_set'
libcuintegrate.a(cuintegrate_generated_cuintegrate.cu.o): In function `cuintegrate(task_t)':
....
тут много раз что-то вроде:
cuintegrate.cu:142: undefined reference to `curandCreateGenerator'
....
collect2: выполнение ld завершилось с кодом возврата 1
make[2]: *** [main] Ошибка 1
make[1]: *** [CMakeFiles/main.dir/all] Ошибка 2
make: *** [all] Ошибка 2
Такая ошибка возникает, если не добавлять флаги к компилятору, которые мне нужны - это -lcurand и -lgsl (первый для библиотеки curand из cuda, второй для библиотеки GSL).. Вот. Переменную я такую вроде бы указал set(LINK_FLAGS "-lcurand -lgsl"), но он её не подхватывает.... может. я что-то неправильно сделал?