在cmakelists.txt中链接GSL

Linking GSL in CMakeLists.txt

本文关键字:链接 GSL txt cmakelists      更新时间:2023-10-16

我有一个带有多个文件的代码,该代码使用GSL库。当我通过命令

对代码编译代码时
g++ main.cpp -lm -lgsl -lgslcblas -o Exec

此编译并给出正确的输出,没有错误。但是,当我尝试在Clion中构建代码时,我会收到错误

undefined reference to `gsl_rng_uniform'

我已经通过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})

我是C 的新手,似乎在网上找不到任何答案。谢谢

您尚未在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)

如果您的代码使用C 11,则需要(1(的行以确保实际获得C 11支持。如果没有CMAKE_CXX_STANDARD_REQUIRED YESCMAKE_CXX_STANDARD变量仅作为"如果可用,则使用它,或者落回编译器可以提供的最接近标准"。如果您很好奇,您可以在此处找到详细的文章。

对您的问题的最重要部分是(2(。find_package()命令查找GSL库等,并使它们可作为导入目标GSL::gslGSL::gslcblas提供。然后,您使用target_link_libraries()将您的可执行文件链接到它们,如图所示。cmake文档说明了 find_package()侧的详细范围:

  • 从这里开始:find_package()
  • GSL的具体细节:FindGSL模块
  • 链接:target_link_libraries()