在 CMakeLists.txt 中链接 GSL
Linking GSL in CMakeLists.txt
我有一个包含多个文件的代码,它使用了 GSL 库。当我使用命令
通过终端编译代码时
g++ main.cpp -lm -lgsl -lgslcblas -o Exec
这会编译并给出正确的输出,没有错误。
但是,当我尝试在 CLion 中构建代码时,出现错误
undefined reference to `gsl_rng_uniform'
我已经通过 CMakeLists.txt 在我的代码中 link 编辑了各种 .cpp 文件,但我认为,我必须将类似于 link 的标志添加到 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++ 的新手,似乎无法在网上找到任何答案。
谢谢
您还没有 link 在 GSL 库中编辑,因此 linker 将找不到它提供的任何符号。像这样的事情应该可以帮助您完成大部分工作:
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 YES
,CMAKE_CXX_STANDARD
变量仅作为 "Use it if it is available, or fall back to the closest standard the compiler can provide"。如果您好奇,可以找到详细的文章 here。
你的问题比较重要的部分在 (2)。 find_package()
命令查找 GSL 库等,并使它们可用作导入目标 GSL::gsl
和 GSL::gslcblas
。然后你使用 target_link_libraries()
到 link 你的可执行文件给他们,如图所示。 CMake 文档详细解释了 find_package()
方面的工作原理:
- 从这里开始:
find_package()
- GSL 的细节:
FindGSL
module
- 链接:
target_link_libraries()
我有一个包含多个文件的代码,它使用了 GSL 库。当我使用命令
通过终端编译代码时g++ main.cpp -lm -lgsl -lgslcblas -o Exec
这会编译并给出正确的输出,没有错误。 但是,当我尝试在 CLion 中构建代码时,出现错误
undefined reference to `gsl_rng_uniform'
我已经通过 CMakeLists.txt 在我的代码中 link 编辑了各种 .cpp 文件,但我认为,我必须将类似于 link 的标志添加到 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++ 的新手,似乎无法在网上找到任何答案。 谢谢
您还没有 link 在 GSL 库中编辑,因此 linker 将找不到它提供的任何符号。像这样的事情应该可以帮助您完成大部分工作:
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 YES
,CMAKE_CXX_STANDARD
变量仅作为 "Use it if it is available, or fall back to the closest standard the compiler can provide"。如果您好奇,可以找到详细的文章 here。
你的问题比较重要的部分在 (2)。 find_package()
命令查找 GSL 库等,并使它们可用作导入目标 GSL::gsl
和 GSL::gslcblas
。然后你使用 target_link_libraries()
到 link 你的可执行文件给他们,如图所示。 CMake 文档详细解释了 find_package()
方面的工作原理:
- 从这里开始:
find_package()
- GSL 的细节:
FindGSL
module - 链接:
target_link_libraries()