Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在CMakeLists.txt中链接GSL_C++_Cmake_Gsl - Fatal编程技术网

C++ 在CMakeLists.txt中链接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文

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

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的详细信息:
  • 链接:

将此命令附加到您的CMakeLists.txt目标链接库(Unitsv1 gsl)中,但可能的副本也必须确保它位于搜索路径中。所以我不得不添加include_目录(${GSL_include_DIR}),但它成功了!非常感谢,真奇怪。导入目标的
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)