在CLion中的Cmakelists.txt中链接GSL

Kah*_*ani 2 c++ cmake gsl clion

我有一个包含多个文件的代码,它使用GSL库.当我使用命令通过终端编译代码时

g++ main.cpp -lm -lgsl -lgslcblas -o Exec
Run Code Online (Sandbox Code Playgroud)

这将编译并提供正确的输出并且没有错误.但是,当我尝试在CLion中构建代码时,我得到了错误

undefined reference to `gsl_rng_uniform'
Run Code Online (Sandbox Code Playgroud)

我已经通过CMakeLists.txt链接了我的代码中的各种.cpp文件,但我认为,我必须使用类似于链接到GSL的标志.我的CMakeLists.txt文件目前如下(只有.cpp文件包含在源文件中,而不是.h文件中):

cmake_minimum_required(VERSION 3.7)
project(Unitsv1)

set(CMAKE_CXX_STANDARD 11)

set(SOURCE_FILES main.cpp
                 transition.cpp
                 random.cpp)
add_executable(Unitsv1 ${SOURCE_FILES})
Run Code Online (Sandbox Code Playgroud)

我是C++的新手,似乎无法在网上找到任何答案.谢谢

Cra*_*ott 10

您尚未在GSL库中链接,因此链接器将找不到它提供的任何符号.这样的事情可以让你在那里大部分时间:

cmake_minimum_required(VERSION 3.7)
project(Unitsv1)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED YES)   # See below (1)

set(SOURCE_FILES main.cpp
                 transition.cpp
                 random.cpp)
add_executable(Unitsv1 ${SOURCE_FILES})

find_package(GSL REQUIRED)    # See below (2)
target_link_libraries(Unitsv1 GSL::gsl GSL::gslcblas)
Run Code Online (Sandbox Code Playgroud)

如果您的代码使用C++ 11,那么您需要(1)处的行来确保您实际获得C++ 11支持.如果没有CMAKE_CXX_STANDARD_REQUIRED YES,该CMAKE_CXX_STANDARD变量仅作为"如果可用则使用它,或者回退到编译器可以提供的最接近的标准".如果你很好奇,可以在这里找到详细的文章.

你问题中更重要的部分是(2).该find_package()命令查找GSL库等,并使它们可用作导入目标GSL::gslGSL::gslcblas.然后target_link_libraries(),您可以使用如下所示将可执行文件链接到它们.CMake文档解释了find_package()事物的各个方面是如何工作的: