Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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++ 在构建树中具有多个CmakeList的CmakeList_C++_Cmake - Fatal编程技术网

C++ 在构建树中具有多个CmakeList的CmakeList

C++ 在构建树中具有多个CmakeList的CmakeList,c++,cmake,C++,Cmake,我有下面的树: /all-targets ----CMakeLists.txt ----/target1 --------CMakeLists.txt --------/include --------/src ----/target2 --------CMakeLists.txt --------/include --------/src ----/target3 --------CMakeLists.txt --------/include --------/src 顶级CMake应该能够

我有下面的树:

/all-targets
----CMakeLists.txt
----/target1
--------CMakeLists.txt
--------/include
--------/src
----/target2
--------CMakeLists.txt
--------/include
--------/src
----/target3
--------CMakeLists.txt
--------/include
--------/src
顶级CMake应该能够将所有目标链接在一起,而不生成任何可执行文件或库文件,只生成具有正确结构/树的任何项目类型

target1需要从target2获得一个库/对象文件,以便对其进行编译

我读过:1。 2.


我现在了解的是,在顶级的CMakeLists.txt中,我可以添加
add subdirectory
命令来添加target1、target2和target3(子目录),但我仍然不知道应该在/target1/CMakeLists.txt中添加什么,以便它可以链接到target2库文件?我认为这不是添加子目录,因为在本例中,target2目录是同级目录,而不是子目录


顶级的CmakeLists.txt文件是否理解,我只想创建一个项目文件,将目标链接在一起,而没有输出(可执行文件-库)。

您没有给我们太多的信息,但我可以提供一个大致的想法

顶级CMakeLists只需对各种目标调用
add\u子目录
。这些应该被分类,这样就没有目标依赖于它后面的目标

对于target1,您可以具有以下功能:

add_library(target1_common STATIC oven.cpp pan.cpp tray.cpp)
target_include_directories(target1_common PUBLIC include)
add_executable(target1 target1_main.cpp)
target_link_libraries(target1 PRIVATE target1_common)
您说过target2依赖于target1的某些部分,因此:

add_library(target2_common STATIC table.cpp chair.cpp plate.cpp)
target_include_directories(target2_common PUBLIC include)
target_link_libraries(target2_common PUBLIC target1_common)

add_executable(target2 target2_main.cpp)
target_link_libaries(target2 PRIVATE target2_common)
这些可执行文件被链接到
PRIVATE
,因为您不会进一步链接到它们,但是
PUBLIC
也可以工作


编辑:添加了
target\u include\u目录
语句,这些语句自动填充
target1\u common
target2\u common
的标题搜索路径。您没有给我们太多的信息,但我可以提供一个大致的想法

顶级CMakeLists只需对各种目标调用
add\u子目录
。这些应该被分类,这样就没有目标依赖于它后面的目标

对于target1,您可以具有以下功能:

add_library(target1_common STATIC oven.cpp pan.cpp tray.cpp)
target_include_directories(target1_common PUBLIC include)
add_executable(target1 target1_main.cpp)
target_link_libraries(target1 PRIVATE target1_common)
您说过target2依赖于target1的某些部分,因此:

add_library(target2_common STATIC table.cpp chair.cpp plate.cpp)
target_include_directories(target2_common PUBLIC include)
target_link_libraries(target2_common PUBLIC target1_common)

add_executable(target2 target2_main.cpp)
target_link_libaries(target2 PRIVATE target2_common)
这些可执行文件被链接到
PRIVATE
,因为您不会进一步链接到它们,但是
PUBLIC
也可以工作


编辑:添加了
target\u include\u目录
语句,这些语句自动填充
target1\u common
target2\u common

的标题搜索路径,它们是什么类型的目标?它们都是独立的可执行文件吗?静态库?它们是单独使用还是在最终的顶级可执行文件/库中链接在一起?“我应该在/target1/CmakeLists.txt中添加什么以便它可以与target2库文件链接?”-假设您在相应的目录中创建了targets
target1
target2
,您需要添加
target\u link\u库(target1 target2)
“顶级CMake应该能够在不生成任何可执行文件或库文件的情况下将所有目标链接在一起”-我不理解。链接是生成某些内容(可执行文件或库)的过程的一部分。能否将
CMakeLists.txt
文件的上下文添加到问题帖子中?这有助于理解您的意图。@是的,它们是独立的可执行文件,也可以用作其他目标的静态库,也可以单独使用,也可以与顶级文件一起使用。(顶层仅用于生成,即包含所有这些内容的xcode项目targets@Tsyvarev我的意思是顶级的
CMakeLists.txt
应该能够产生。也就是说,Xcode项目包含所有的目标。我不知道我是否能够以正确的方式解释我的想法:\n这些目标是什么类型的?它们都是标准的吗一个可执行文件?静态库?它们是单独使用还是在最终的顶级可执行文件/库中链接在一起?“我应该在/target1/CmakeLists.txt中添加什么以便它可以链接到target2库文件?”-假设在相应目录中创建了目标
target1
target2
,则需要添加
target\u link\u库(target1-target2)
“顶级CMake应能够将所有目标链接在一起,而无需生成任何可执行文件或库文件”-我不明白。链接是产生某些东西(可执行文件或库)的过程的一部分。能否将
CMakeLists.txt
文件的上下文添加到问题帖子中?这有助于理解您的意图。@是的,它们是独立的可执行文件,也可以用作其他目标的静态库,也可以单独使用,也可以与顶级文件一起使用。(顶层仅用于生成,即包含所有这些内容的xcode项目targets@Tsyvarev我的意思是顶级的
CMakeLists.txt
应该能够生成。也就是说,Xcode项目包含所有目标。我不知道我是否能够以正确的方式解释我的想法:\n所以如果我添加了
target\u link\u库(target2_公共target1_公共)
仅,
/target2/CMakeLists.txt
将搜索
target1_公共
而不指定其搜索路径,对吗?不确定“搜索”是什么意思.CMake将编译静态库
target1_common
,并将其标记为链接到
target2_common
时的
target2_common
的依赖项。如果我需要包含target1_common的头,该怎么办?您添加的命令将获取target1_common的头?是的。公共和接口包含路径是可选的如果我只添加了
target\u link\u库(target2\u common PUBLIC target1\u common)
,那么
/target2/CMakeLists.txt
将搜索
target1\u common
,而不指定搜索路径,对吗?不确定“搜索”是什么意思.CMake将编译静态库
target1_common
,并将其标记为
target2_common
的依赖项,以便在