Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Cmake为“一个”中的多个子库配置;“包装”;目录_C++_Cmake - Fatal编程技术网

C++ Cmake为“一个”中的多个子库配置;“包装”;目录

C++ Cmake为“一个”中的多个子库配置;“包装”;目录,c++,cmake,C++,Cmake,这是一个示例项目,我正试图使用一个“Packages”目录构建它,该目录包含主代码中要使用的所有库 我试图保持我的根cmake文件尽可能干净,并避免相对路径,如 include_directory(packages/lib1) 但我在挣扎。是否有一种方法可以将目录的子目录包含在标题中。首先,请注意以下几点: 始终命名CMake配置文件CMakeLists.txt() 在CMake上为文档添加书签: 有时阅读起来并不那么容易,但一旦你将你的头脑带入“CMake世界”,它就会变得非常具体 让你自

这是一个示例项目,我正试图使用一个“Packages”目录构建它,该目录包含主代码中要使用的所有库

我试图保持我的根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)。但是我有错误。知道它为什么不能正常工作吗?