首页 > 解决方案 > 在 CLion 和 Cmake 中设置外部头文件和链接器库的问题

问题描述

在过去一年左右主要在 Linux 上使用 code::blocks 之后,我才开始使用 CLion 作为我的 IDE。但是,我发现很难建立一个在 code::blocks 中工作和编译良好的项目,因为我还不了解 cmake。

这是我的项目的简要描述 - 它由一个主文件组成,该文件调用了一些头文件和源文件,它们都在同一个目录中。在主文件中,我还调用了一个外部头文件(“coupling.h”,位于“/opt/package/API_SRC_Files/Coupling”中),它描述了一些与该软件耦合相关的类。“coupling.h”文件又引用了“/opt/package/API_SRC_Files/Coupling”中的一些文件。我还需要链接到位于“/opt/package/lib”中的共享库文件“libcoupling.so”。

在 code::blocks 中进行设置非常简单 - 只需转到构建选项、搜索目录的相应路径以及链接文件的路径,然后进行构建。在几秒钟内编译。

我试图在 CLion 和 CMake 中设置项目,但我真的迷路了,我真的不明白为什么 CMake 找不到“coupling.h”文件并抛出无数“未定义的引用”错误。我敢肯定,我在设置共享库时也会遇到问题,而且我什至不敢考虑目前调试和发布版本的区别!

这是我当前的 CMake.txt 文件,希望有人可以提供帮助。我在 Fedora 上使用 CLion 2020.1。

cmake_minimum_required(VERSION 3.16)
project(MBD VERSION 0.6.1)

set(CMAKE_CXX_STANDARD 14)

# add extra include directories
include_directories(.)
include_directories(/opt/package/API_SRC_Files)
include_directories(/opt/package/API_SRC_Files/Core)
include_directories(/opt/package/API_SRC_Files/Coupling)

set(PROJECT_HEADERS
        coupling_utilities.h
        geometry.h
        io.h
        shapelib.h
        pid.h
        spline.h
        )

set(PROJECT_SOURCES
        main.cpp
        io.cpp
        coupling_utilities.cpp
        shapelib.cpp
        pid.cpp
        )

# add extra lib directories
link_directories(/opt/package/lib)

add_executable(MBD ${PROJECT_SOURCES} ${PROJECT_HEADERS})

这是与 include_directories() 相关的输出中的错误日志:

/snap/clion/114/bin/cmake/linux/bin/cmake --build /home/user/CLionProjects/mbd/cmake-build-debug --target mbd -- -j 24
-- 配置完成
-- 生成完成
-- 构建文件已写入:/home/user/CLionProjects/mbd/cmake-build-debug
[ 16%] 链接 CXX 可执行 mbd
/usr/bin/ld:CMakeFiles/mbd.dir/main.cpp.o:在函数“main”中:
/home/user/CLionProjects/mbd/main.cpp:224:未定义对 `NApi::Coupling::getGeometryId(char const*, int&)' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:260: 未定义对 `NApi::Coupling::getTimeStep(double&)' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:268: 未定义对 `NApi::Coupling::getTime(double&)' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:273: 未定义对 `NApi::Coupling::setTime(double const&)' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:276: 未定义对 `NApi::Coupling::getTime(double&)' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:285: 未定义对 `NApi::Coupling::setGridCellSize(double const&)' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:288: 未定义引用`NApi::Coupling::setNumberOfCores(int const&)'
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:343: 未定义引用`NApi::Coupling::getGeometryPosition(int, NApi::C3dValue&, NApi::C3x3Matrix&)'
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:345: 未定义引用`NApi::Coupling::getGeometryTranslation(int, NApi::C3dValue&)'
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:348: 未定义引用`NApi::Coupling::getGeometryVelocity(int, NApi::C3dValue&, NApi::C3dValue&)'
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:442: 未定义对 `NApi::Coupling::isConnected() const' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:444: 未定义引用`NApi::Coupling::getGeometryForces(int, NApi::C3dValue&, NApi::C3dValue&)'
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:531: 未定义对 `NApi::Coupling::isConnected() const' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:534: 未定义对`NApi::Coupling::setGeometryMotion(int, NApi::C3dValue const&, NApi::C3x3Matrix const&, NApi: :C3dValue const&, NApi::C3dValue const&, double, bool)'
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:554: 未定义对 `NApi::Coupling::isConnected() const' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:556: 未定义对 `NApi::Coupling::simulate(double const&, double)' 的引用
/usr/bin/ld: CMakeFiles/mbd.dir/main.cpp.o: 在函数`__static_initialization_and_destruction_0(int, int)'中:
/home/user/CLionProjects/mbd/main.cpp:74:未定义对“NApi::Coupling::ICoupling()”的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/main.cpp:74: 未定义对 `NApi::Coupling::~ICoupling()' 的引用
/usr/bin/ld: CMakeFiles/mbd.dir/coupling_utilities.cpp.o: 在函数'connect(NApi::Coupling&)'中:
/home/user/CLionProjects/mbd/coupling_utilities.cpp:54:未定义对“NApi::Coupling::initialiseCoupling()”的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/coupling_utilities.cpp:67: 未定义对 `NApi::Coupling::connectCoupling(bool, char const*)' 的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/coupling_utilities.cpp:90: 未定义引用`NApi::Coupling::connectCoupling(bool, char const*)'
/usr/bin/ld: CMakeFiles/mbd.dir/coupling_utilities.cpp.o: 在函数`getResumeTimestep(NApi::Coupling&, double, double)'中:
/home/user/CLionProjects/mbd/coupling_utilities.cpp:109:未定义对“NApi::Coupling::getNumberOfTimesteps(unsigned int&)”的引用
/usr/bin/ld: /home/user/CLionProjects/mbd/coupling_utilities.cpp:136: 未定义引用`NApi::Coupling::getTimesteps(double*, unsigned int&, unsigned int)'
collect2:错误:ld 返回 1 个退出状态
gmake[3]: *** [CMakeFiles/mbd.dir/build.make:144: mbd] 错误 1
gmake[2]: *** [CMakeFiles/Makefile2:76: CMakeFiles/mbd.dir/all] 错误 2
gmake[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/mbd.dir/rule] 错误 2
gmake: *** [Makefile:118: mbd] 错误 2

标签: c++cmakeclion

解决方案


这是我编写cmakelists.txt文件的方式:

cmake_minimum_required(VERSION 3.16)
project(MBD VERSION 0.6.1)

set(CMAKE_CXX_STANDARD 14)

set(API_SRC_Files /opt/package/API_SRC_Files) # ${API_SRC_Files}

set(SRC_FILES
        main.cpp
        coupling_utilities.h coupling_utilities.cpp
        geometry.h
        io.h io.cpp
        pid.h pid.cpp
        shapelib.h shapelib.cpp
        spline.h
        )

# add extra include directories
include_directories(
        includes
        .
        ${API_SRC_Files}
        ${API_SRC_Files}/Core
        ${API_SRC_Files}/Coupling
        )

# add extra lib directories
link_directories(/opt/package/lib)

add_executable(${PROJECT_NAME} ${SRC_FILES})

使用变量之类的东西有API_SRC_Files两个原因:减少重复相同路径信息的错误,使库移动到新位置时更容易。使用PROJECT_NAME变量也是如此。该评论是为了提醒自己稍后如何在文件中使用该变量。

将您的 SRC_FILES 和 SRC_HEADERS 合并到一个数组中,其中源和匹配的标头位于同一行。这有助于确保两者都被列出。请注意,当您告诉 Clion 您要添加新的C++ Class时,它将采用 形式class.cpp class.h,而不是按字母顺序排列。我总是先列出main.cpp, 。

中的点 ,可能是必需.的,include_directories也可能不是必需的。

希望这可以帮助。


推荐阅读