代码之家  ›  专栏  ›  技术社区  ›  Kahealani

在CMakeLists.txt中链接GSL

  •  4
  • Kahealani  · 技术社区  · 7 年前

    g++ main.cpp -lm -lgsl -lgslcblas -o Exec
    

    然而,当我尝试在CLion中构建代码时,我得到了错误

    undefined reference to `gsl_rng_uniform'
    

    我已经通过CmakeList链接了代码中的各种.cpp文件。txt,但我认为,我必须使用类似于标志的东西来链接到GSL。 我的简历。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++很陌生,似乎在网上找不到任何答案。

    1 回复  |  直到 4 年前
        1
  •  13
  •   Craig Scott    7 年前

    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 变量的作用仅为“在可用时使用它,或返回到编译器可以提供的最接近的标准”。你可以找到详细的评论 here

    你的问题更重要的部分在(2)。这个 find_package() 命令查找GSL库等,并将其作为导入目标 GSL::gsl GSL::gslcblas target_link_libraries() 将可执行文件链接到它们,如图所示。CMake文档解释了 find_包()