C++ 在CMakeLists.txt中链接GSL
我有一个包含多个文件的代码,它使用GSL库。当我用命令通过终端编译代码时C++ 在CMakeLists.txt中链接GSL,c++,cmake,gsl,C++,Cmake,Gsl,我有一个包含多个文件的代码,它使用GSL库。当我用命令通过终端编译代码时 g++ main.cpp -lm -lgsl -lgslcblas -o Exec 这将编译并提供正确的输出,并且没有错误。 然而,当我尝试在CLion中构建代码时,我得到了错误 undefined reference to `gsl_rng_uniform' 我已经通过CMakeLists.txt链接了代码中的各种.cpp文件,但是我认为,我必须使用类似于标志的东西来链接到GSL。 我的CMakeLists.txt文
g++ main.cpp -lm -lgsl -lgslcblas -o Exec
这将编译并提供正确的输出,并且没有错误。
然而,当我尝试在CLion中构建代码时,我得到了错误
undefined reference to `gsl_rng_uniform'
我已经通过CMakeLists.txt链接了代码中的各种.cpp文件,但是我认为,我必须使用类似于标志的东西来链接到GSL。
我的CMakeLists.txt文件当前如下(源文件中仅包含.cpp文件,而不是.h文件):
我对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 YES
,则CMAKE_CXX_STANDARD
变量仅充当“在可用时使用它,或退回到编译器可以提供的最接近的标准”。如果你好奇的话,你可以找到详细的评论
你的问题更重要的部分在(2)。find_package()
命令查找GSL库等,并将它们作为导入目标GSL::GSL
和GSL::gslcblas
提供。然后使用target\u link\u libraries()
将可执行文件链接到它们,如图所示。CMake文档详细解释了事物的find_package()
方面是如何工作的:
- 从这里开始:
- GSL的详细信息:
- 链接:
GSL::GSL
已将其INTERFACE\u INCLUDE\u目录
属性设置为GSL\u INCLUDE\u DIRS
的内容,因此不需要这样做。
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)