我有一个包含多个文件的代码,它使用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 ++很陌生,似乎无法在线找到任何答案。 感谢
答案 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()
方面的工作原理非常详细:
find_package()
FindGSL
module target_link_libraries()