0

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

filip
  • 628
  • 2
  • 8
  • 31
  • 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 Dec 03 '18 at 09:58
  • Works BUT new Error Code! @Tsyvarev Updated my Post. – filip Dec 03 '18 at 10:00
  • Well, looks like you need to link your executable with `cblas` too. – Tsyvarev Dec 03 '18 at 10:11
  • Possible duplicate of [Linking GSL in Cmakelists.txt in CLion](https://stackoverflow.com/questions/44821615/linking-gsl-in-cmakelists-txt-in-clion) – Tsyvarev Dec 03 '18 at 10:14

1 Answers1

2

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})
Silmathoron
  • 1,781
  • 1
  • 15
  • 32
  • I want to implement a neuronalnetwor in C and I want to use a matrix library. Pretty new to C so I just downloaded it from their site – filip Dec 03 '18 at 10:15
  • then just search for `libgsl` (and potentially `libgsl-dev`) in your package manager and install it, then you can just use eigen's FindGSL to get its location in the system – Silmathoron Dec 03 '18 at 10:17
  • So when do I need to implement it like this? @Silmathoron – filip Dec 03 '18 at 10:18
  • sorry, implement what like what? – Silmathoron Dec 03 '18 at 10:19
  • You suggest using it as an external dependency (with libgsl and libgsl-dev). You can also do it by compiling and importing it with cmake. When do I choose which path? – filip Dec 03 '18 at 10:21
  • see edit, you do not chose the path, the code in FindGSL.cmake does the lookup – Silmathoron Dec 03 '18 at 10:33
  • So where to copy the findgsl.cmake https://raw.githubusercontent.com/Kitware/CMake/master/Modules/FindGSL.cmake? – filip Dec 03 '18 at 10:34
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/184619/discussion-between-silmathoron-and-filip). – Silmathoron Dec 03 '18 at 10:35
  • Thank you very much for your patience and help! Fixed! – filip Dec 13 '18 at 13:01