在 CMakeLists.txt 中链接 GSL

Posted

技术标签:

【中文标题】在 CMakeLists.txt 中链接 GSL【英文标题】:Linking GSL in CMakeLists.txt 【发布时间】:2017-06-29 09:41:28 【问题描述】:

我有一个包含多个文件的代码,它使用 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++ 很陌生,似乎无法在网上找到任何答案。 谢谢

【问题讨论】:

将此命令附加到您的 CMakeLists.txt target_link_libraries(Unitsv1 gsl) What is an undefined reference/unresolved external symbol error and how do I fix it?的可能重复 必须确保它也在搜索路径中。 cmake.org/cmake/help/v3.0/command/link_directories.html 【参考方案1】:

您尚未在 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 变量仅充当“如果它可用,则使用它,或者回退到编译器可以提供的最接近的标准”。如果您有兴趣,可以找到详细的文章here。

您的问题更重要的部分是 (2)。 find_package() 命令查找 GSL 库等,并使它们可用作导入目标 GSL::gslGSL::gslcblas。然后使用target_link_libraries() 将可执行文件链接到它们,如图所示。 CMake 文档详细解释了 find_package() 方面的工作原理:

从这里开始:find_package() GSL 规范:FindGSL module 链接:target_link_libraries()

【讨论】:

所以我不得不添加 include_directories($GSL_INCLUDE_DIR) 但它起作用了!非常感谢。 这很奇怪。 GSL::gsl 导入目标已将其 INTERFACE_INCLUDE_DIRECTORIES 属性设置为 GSL_INCLUDE_DIRS 的内容,因此没有必要这样做。

以上是关于在 CMakeLists.txt 中链接 GSL的主要内容,如果未能解决你的问题,请参考以下文章

cmakelists.txt中怎么增加动态链接库lzmq

如何在 CMakeLists.txt 中设置 LDFLAGS?

在 CMakeLists.txt 中添加 FLTK 库

将 Makefile 转换为 CMakeLists.txt

生成库文件,会链接依赖的库文件吗?

CMakeLists.txt 结构