【发布时间】:2019-02-01 06:13:52
【问题描述】:
我正在反复讨论这个令人困惑的 CMake 概念。我已经阅读了几篇描述如何编写 CMake 文件的文章。但我发现它的解释非常少。
第 1 点 - 我是否必须为每个文件夹制作单独的 CMakeLists.txt(是的,为简单起见,我们将其称为文件夹)?
第 2 点 - 显然 第 1 点的答案是否。我发现这些命令可以自动搜索*.cpp 文件
# get all *.cpp files recursively
file(GLOB_RECURSE SRC_LIST *.c* *.h*)
第 3 点 - 似乎无需提及 *.hpp 文件。 (这是含糊的点)
我尝试编译最简单的 Hello World! 程序
CMakeLists.txt
src
| - main.cpp (here I included #include "XYZ/abc.hpp")
| - XYZ
| - abc.cpp (included #include "XYZ/abc.hpp")
| - abc.hpp
为此的 CMake 是
cmake_minimum_required(VERSION 3.10)
project(CMAkeSample)
add_executable(hello src/main.cpp src/XYZ/abc.cpp)
这建议,添加所有.cpp 文件以及add_executable 中的路径,我们就完成了。
这是真的吗?
第 4 点 - 现在我有一个比较大的项目(出于任何原因 在 eclipse 中开发)。但我需要为它制作cmake文件,因此不使用eclipse进行构建。
下面是文件系统,我只想制作一次CMakeLists.txt(如果可能的话)
CMakeLists.txt
src
| - main.cpp (here I included #include "File0.hpp" and #include "Folder1/File1.hpp")
| - File0.cpp (here I included #include "File0.hpp")
| - File0.hpp (here I included #include "Folder1/File1.hpp" and #include "Folder2/File2.hpp")
| - Folder1
| - File1.cpp (included #include "File1.hpp")
| - File1.hpp
| - Folder2
| - File2.cpp (included #include "File2.hpp")
| - File2.hpp
那么现在如何获取所有.cpp 文件,而无需在每个文件夹中手动编写cmake。有什么建议吗?
更新 1:
我已经添加了CMakeLists.txt,如图所示
ProjectFolder
CMakeLists.txt
src
| - CMakeLists.txt
| - main.cpp (here I included #include "File0.hpp" and #include "Folder1/File1.hpp")
| - File0.cpp (here I included #include "File0.hpp")
| - File0.hpp (here I included #include "Folder1/File1.hpp" and #include "Folder2/File2.hpp")
| - Folder1
| - CMakeLists.txt
| - File1.cpp (included #include "File1.hpp")
| - File1.hpp
| - Folder2
| - CMakeLists.txt
| - File2.cpp (included #include "File2.hpp")
| - File2.hpp
在ProjectFolder > src > CMakeLists.txt
add_library(main main.cpp File0.cpp File0.hpp)
target_link_libraries(main File1)
在ProjectFolder > src > File1 > CMakeLists.txt
add_library(File1 File1.cpp File1.hpp)
target_link_libraries(File1 File2)
在ProjectFolder > src > File > CMakeLists.txt
add_library(File2 File2.cpp File2.hpp)
毕竟,我得到的错误是,
-- Configuring done
-- Generating done
-- Build files have been written to: /path/to/ProjectFolder
[ 33%] Built target main
[ 44%] Building CXX object CMakeFiles/ProjectFolder.dir/src/main.cpp.o
[ 55%] Linking CXX executable ProjectFolder
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ld: cannot find -lFile1
更新 2:
继续前进,为了完成这项工作,这里和那里进行了一些更改(如 UPDATE 1 中所述,并在项目文件夹的 CMakeLists.txt 中手动添加链接
set(GCC_LINK_FLAGS "-lpthread -lcurl -lgobject-2.0 -lgstreamer-1.0 -lglib-2.0 -lssl -lcrypto -lboost_thread -lboost_system")
add_subdirectory(src)
add_subdirectory(src/Folder1)
add_subdirectory(src/Folder2)
add_executable(ProjectFolder src/main.cpp)
target_link_libraries(ProjectFolder main ${GCC_LINK_FLAGS})
程序完美执行。但显然这是编写链接的非常粗糙的方式。正在寻找 Point2 的解决方案。
【问题讨论】:
-
"如何获取所有
.cpp文件而不需要在每个文件夹中手动编写cmake?" - 您已经展示了使用file(GLOB_RECURSE)的解决方案。那么,您想从我们这里得到什么? -
这对我不起作用,而且我从未使用过 cmake,所以我不知道要问什么,所以我问了一般问题。正如@scheff 建议的那样,我正在慢慢浏览这些文件。并在每个子目录中编写 Cmakes
-
“这对我没有正常工作” - 那么您可能需要描述(在问题帖子中),在这种情况下究竟是什么不起作用,所以我们可以帮助你解决这个问题。
标签: c++ cmake compilation