C++ Cmake为“一个”中的多个子库配置;“包装”;目录
这是一个示例项目,我正试图使用一个“Packages”目录构建它,该目录包含主代码中要使用的所有库 我试图保持我的根cmake文件尽可能干净,并避免相对路径,如C++ Cmake为“一个”中的多个子库配置;“包装”;目录,c++,cmake,C++,Cmake,这是一个示例项目,我正试图使用一个“Packages”目录构建它,该目录包含主代码中要使用的所有库 我试图保持我的根cmake文件尽可能干净,并避免相对路径,如 include_directory(packages/lib1) 但我在挣扎。是否有一种方法可以将目录的子目录包含在标题中。首先,请注意以下几点: 始终命名CMake配置文件CMakeLists.txt() 在CMake上为文档添加书签: 有时阅读起来并不那么容易,但一旦你将你的头脑带入“CMake世界”,它就会变得非常具体 让你自
include_directory(packages/lib1)
但我在挣扎。是否有一种方法可以将目录的子目录包含在标题中。首先,请注意以下几点:
- 始终命名CMake配置文件
()CMakeLists.txt
- 在CMake上为文档添加书签:
有时阅读起来并不那么容易,但一旦你将你的头脑带入“CMake世界”,它就会变得非常具体李> - 让你自己舒服一点
告诉CMake编译器应该在哪里查找头文件,即
-IDIR1-IDIR2…
此命令创建所需的编译器命令,以便从给定的源文件列表中创建静态或共享库。不需要添加头文件。make目标将被称为
NAME
,而库目标被CMake称为NAME
告诉CMake查看
DIR
并解析包含的CMakeLists.txt
及其所有内容
告诉CMake指示链接器将
LIB1
、LIB2
等链接到目标,即-LLIB1-LLIB2…
TARGET
是以前通过调用add{library,executable,custom_TARGET}
定义/创建的CMake/make目标
CMakeLists.txt:
include_directories(libraries)
# a header file in `libraries/lib1/foo.hpp` can be included
# in the whole CMake project by `#include "lib1/foo.hpp"`.
add_subdirectory(libraries)
add_subdirectory(tests)
add_subdirectory(lib1)
add_subdirectory(lib2)
add_library(lib1 STATIC ${LIB1_SOURCES})
add_library(lib2 STATIC ${LIB2_SOURCES})
add_executable(tests ${TEST_SOURCES})
target_link_libraries(tests lib1 lib2)
库/CMakeLists.txt:
include_directories(libraries)
# a header file in `libraries/lib1/foo.hpp` can be included
# in the whole CMake project by `#include "lib1/foo.hpp"`.
add_subdirectory(libraries)
add_subdirectory(tests)
add_subdirectory(lib1)
add_subdirectory(lib2)
add_library(lib1 STATIC ${LIB1_SOURCES})
add_library(lib2 STATIC ${LIB2_SOURCES})
add_executable(tests ${TEST_SOURCES})
target_link_libraries(tests lib1 lib2)
库/lib1/CMakeLists.txt:
include_directories(libraries)
# a header file in `libraries/lib1/foo.hpp` can be included
# in the whole CMake project by `#include "lib1/foo.hpp"`.
add_subdirectory(libraries)
add_subdirectory(tests)
add_subdirectory(lib1)
add_subdirectory(lib2)
add_library(lib1 STATIC ${LIB1_SOURCES})
add_library(lib2 STATIC ${LIB2_SOURCES})
add_executable(tests ${TEST_SOURCES})
target_link_libraries(tests lib1 lib2)
库/lib2/CMakeLists.txt:
include_directories(libraries)
# a header file in `libraries/lib1/foo.hpp` can be included
# in the whole CMake project by `#include "lib1/foo.hpp"`.
add_subdirectory(libraries)
add_subdirectory(tests)
add_subdirectory(lib1)
add_subdirectory(lib2)
add_library(lib1 STATIC ${LIB1_SOURCES})
add_library(lib2 STATIC ${LIB2_SOURCES})
add_executable(tests ${TEST_SOURCES})
target_link_libraries(tests lib1 lib2)
测试/CMakeLists.txt:
include_directories(libraries)
# a header file in `libraries/lib1/foo.hpp` can be included
# in the whole CMake project by `#include "lib1/foo.hpp"`.
add_subdirectory(libraries)
add_subdirectory(tests)
add_subdirectory(lib1)
add_subdirectory(lib2)
add_library(lib1 STATIC ${LIB1_SOURCES})
add_library(lib2 STATIC ${LIB2_SOURCES})
add_executable(tests ${TEST_SOURCES})
target_link_libraries(tests lib1 lib2)
请展示你为实现目标所做的努力。所以它不是一个编码服务。它是add_子目录、include_目录等的混合体。但我不断地出错。我已经看过了教程,其中介绍了在各个目录中添加库的情况。把它们都放在另一个目录中会引起问题。@Torbjörn我不理解那些反对票。我有一个关于CMakeLists.txt及其子库的具体问题。我不想用一个与问题无关的墙文本把问题弄得乱七八糟,但我已经添加了我对这个问题的尝试。项目结构的主要部分应该在问题帖本身,而不是链接到外部引用。即使是查看回购协议,目前对这个问题的修改对我来说似乎完全不清楚。猜测一下:您是否希望/是否可以使用两行代码添加测试:add\u executable(test\u target1…)
和target\u link\u库(test\u target1 lib1)
?(因此测试根本不需要包含_目录
,这将自动完成。)谢谢。我只把它们命名为CmakeLists1等,这样我可以更容易地引用它们,但我还是设法把它们弄混了。不管怎样,您确定在根CmakeList.txt中包含目录(库)吗?它是否也包含所有的子目录?此外,理想情况下,我希望我的lib1、lib2等拥有自己的Cmake文件,因此更喜欢在各自的Cmake文件(在目录lib1等内)中添加库(lib1…),如果可能,只从Libraries/CmakeLists.txt中添加子目录(lib1)。我不确定的是我应该把include()放在哪里。我已经更新了我的尝试。但是Libraries/CMakeLists.txt中的include目录似乎没有被继承,根Cmake文件中的“全局”include_目录(库)不起作用。已将项目上载到github。希望这会让事情变得更简单。我编辑了答案,使它更具体。是的,include\u目录的位置是正确的。请重新阅读目标链接库上的文档
;只能使用CMake/make目标,没有目录名。谢谢。但是,我不想在我的includes中执行“lib1/foo.hpp”。我做了更多的研究并提出了这个新版本的代码:我确实:在我的lib2的Cmake文件中包含目录(${lib1\u SOURCE\u DIR})添加库(lib2 STATIC${SOURCE\u FILES}${HEADER\u FILES})目标链接库(lib2 lib1)。但是我有错误。知道它为什么不能正常工作吗?