在Cion

时间:2017-06-29 09:41:29

标签: c++ cmake clion gsl

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

1 个答案:

答案 0 :(得分:8)

您没有在GSL库中链接,因此链接器将找不到它提供的任何符号。这样的事情可以让你在那里大部分时间:

section#products {
    height: 700px;
    max-width: 100%

}

.row {
    height: 350px;
    max-width: 100%;
}

.agencyproducts {
    position: relative;
    display: block;
    text-align: center;

}

.agencyproducts img {

    position: relative;
    line-height: 1;
    top: 50%;

}

.agencyproducts h4 {

    display: block;
    text-align: center;
    font-size: 10px;

}

如果您的代码使用C ++ 11,那么您需要(1)处的行以确保您实际获得C ++ 11支持。如果没有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) CMAKE_CXX_STANDARD_REQUIRED YES变量仅作为“如果可用则使用它,或者回退到编译器可以提供的最接近的标准”。如果您感到好奇,可以找到详细的文件here

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