在 CLion 和 Cmake 中设置外部头文件和链接器库的问题 [重复]

Posted

技术标签:

【中文标题】在 CLion 和 Cmake 中设置外部头文件和链接器库的问题 [重复]【英文标题】:Problems setting external headers and linker libraries in CLion and Cmake [duplicate] 【发布时间】:2020-06-25 17:20:45 【问题描述】:

在过去一年左右主要在 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

【问题讨论】:

你没有正确链接任何库,你看到this问题的回复了吗? @squareskittles 好的,我在搜索过程中没有看到那个特定的问题,这可能对共享库有所帮助。我还没有在我的 makefile 中设置它,因为它应该只使用头文件进行编译,但 include_directories() 似乎不起作用。另一个答案似乎表明应该使用 target_include_directories 但这有点令人困惑 - 我不确定目标是什么。 您能否提供与包含文件有关的完整错误消息?从错误的描述很难理解发生了什么...... 谢谢,您的include_directories() 电话没有任何问题。错误消息是 linker 错误,因为您实际上还没有将库 libcoupling.so 链接到您的可执行文件。同样,请查看对我之前链接问题的回复,因为它们通常适用于 any 外部库。特别是,您可以尝试this 响应来解决问题 - 如您所见,您缺少 target_link_libraries 命令。 @squareskittles 谢谢。这确实是问题所在 - 链接器设置不正确。 【参考方案1】:

这是我将如何编写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 中的点 . 可能需要也可能不需要。

希望这会有所帮助。

【讨论】:

虽然这通常是一个很好的建议,但它并没有解决问题中的错误。

以上是关于在 CLion 和 Cmake 中设置外部头文件和链接器库的问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使 CLion 在 .cpp 文件中插入生成的代码....

使用外部附加头文件构建 cmake 对象库

如何在Firebase云函数中设置特定头文件的缓存?

在 CLion 中设置 OpenMP 项目 MacOS Mojave

在 cmake 中设置 PKG_CONFIG_PATH

如何在 JBoss EAP 6.1 中设置 http 头文件