c++ - 在 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
解决方案
这是我编写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
也可能不是必需的。
希望这可以帮助。
推荐阅读
- android - LiveData 未在 postValue() 上更新
- node.js - 使用 wp_insert_post 时,Wordpress 正在从 base64 编码图像中删除“数据”属性
- python - Stackdriver Strace 使用 python 为一个请求嵌入跟踪
- tensorflow - 训练后去除高斯噪声层?
- python-3.x - TypeError:'int'对象在python中执行sum()函数时不可调用
- javascript - 比较数组时显示/隐藏项目
- javascript - 为什么我用 jQuery 添加的新段落在点击时没有任何作用?
- python - 将列表中的字符串转换为日期时间,导致 ValueError:格式不匹配。'"%d.%m.%Y %H:%M"'
- sql - 通过对表中的数据进行分组来创建新表
- qlikview - 根据另一个图表/字段/KPI 对 qlik 中的图表进行排序