0
votes

Trying to use GSL (Ubuntu 18.04) with CMake.

Installed it according to their INSTALL file:

"sudo sh configure && sudo make && sudo make install"

My Folder Structure:

Folder Structure

The GSL header files are located in /gsl-2.5/gsl/

My CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(neuronalnetwork C)

set(CMAKE_C_STANDARD 99)

add_executable(neuronalnetwork main.c)


include_directories(gsl-2.5/gsl)
LINK_DIRECTORIES(gsl-2.5)
target_link_libraries(main.c gsl)

Error:

CMake Error at CMakeLists.txt:11 (target_link_libraries):
  Cannot specify link libraries for target "main.c" which is not built by
  this project.

If adding target_link_libraries(neuronalnetwork gsl) I get this error:

Update New Error:

/opt/clion/bin/cmake/linux/bin/cmake --build /home/filip/Projekte/neuronalnetwork/cmake-build-debug --target neuronalnetwork -- -j 4
Scanning dependencies of target neuronalnetwork
[ 50%] Building C object CMakeFiles/neuronalnetwork.dir/main.c.o
[100%] Linking C executable neuronalnetwork
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ctrmv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zswap'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zsymm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cgeru'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_sgemm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ctrsv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_sgemv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_srotg'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zgemm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cdotu_sub'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dznrm2'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ddot'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_csymm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cher2k'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zdotu_sub'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_sdot'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_sdsdot'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cgerc'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_scnrm2'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ctrmm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_sscal'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_strmm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zcopy'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dsyrk'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cherk'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zherk'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zher'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ztrmv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_drotmg'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dswap'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_scopy'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_scasum'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zscal'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_drotg'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zdotc_sub'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cscal'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_caxpy'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zsyr2k'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ssyr2k'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_csyr2k'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ztrsm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ctrsm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ssymm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cdotc_sub'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zher2k'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_saxpy'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_idamax'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_snrm2'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dsdot'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cher'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dger'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cher2'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dzasum'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dsyr2'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ssyrk'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_strmv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dgemv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cgemm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dasum'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dsymv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_srotm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_sswap'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dtrmv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_isamax'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zhemv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zaxpy'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dcopy'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_sasum'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dsyr'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_strsm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_drot'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ztrsv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_izamax'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ssymv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_chemm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zgeru'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dtrsv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_sger'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_srot'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dsymm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ztrmm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zdscal'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zher2'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ssyr'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dtrmm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zgerc'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_csscal'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dsyr2k'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_chemv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dnrm2'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_drotm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_icamax'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zgemv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zhemm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cgemv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ssyr2'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_strsv'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dscal'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dgemm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_srotmg'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_dtrsm'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_ccopy'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_zsyrk'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_cswap'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_daxpy'
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libgsl.so: undefined reference to `cblas_csyrk'
collect2: error: ld returned 1 exit status

Suggestions in other questions didn't work

1
Name of the executable target is neuronalnetwork (the first argument for add_executable command). This name should be used with target_link_libraries.Tsyvarev
Works BUT new Error Code! @Tsyvarev Updated my Post.filip
Well, looks like you need to link your executable with cblas too.Tsyvarev

1 Answers

2
votes

Your new error message tells you that the blas library, is not found; see the gsl example for the linker flags you need to add.

For more advanced details on how to work with GSL through CMake, look at the FindGSL.cmake file of the eigen project.

More generally, one would usually use GSL as an external dependency, are you sure you want to include it in your code?

EDIT from the comments, you should use GSL as an external dependency, just install it on your system using your linux package manager (look for gsl and make sure to get the header files)

Then, copy the FindGSL.cmake file of eigen, copy it somewhere, then, as they do here run, in your CMakeLists.txt

find_package(GSL)
include_directories(${GSL_INCLUDE_DIR})

Note that if you want to put the .cmake in a specific directory, you will need to tell CMake where to look for it using

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/where/you/put/the/file/)

EDIT 2:

To make it more explicit, here is the full code you need:

cmake_minimum_required(VERSION 3.12)
project(neuronalnetwork C)

set(CMAKE_C_STANDARD 99)

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
find_package(GSL)

add_executable(neuronalnetwork main.c)
target_include_directories(neuronalnetwork PRIVATE ${PROJECT_SOURCE_DIR} ${GSL_INCLUDE_DIR})
target_link_libraries(neuronalnetwork ${GSL_LIBRARIES})