在 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 文件中插入生成的代码....