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
现代CMake依赖传播_Cmake - Fatal编程技术网

现代CMake依赖传播

现代CMake依赖传播,cmake,Cmake,我们有下面的文件夹结构,同意它有点奇怪,但它就是这样 LIB Cmakelist1 Project MainProject CMakeList2 SubProject1 CMakeList3 SubProject2 CmakeList4 问题1:Cmakelist2包含以下内容: add_subdirectory(LIB/CMakelist1) 这是可以接受的,还是有更好的现代CMake方式? 这个问题解决了,看起来很好

我们有下面的文件夹结构,同意它有点奇怪,但它就是这样

LIB
   Cmakelist1
Project
   MainProject
     CMakeList2
     SubProject1
       CMakeList3
     SubProject2
       CmakeList4
问题1:
Cmakelist2
包含以下内容:

add_subdirectory(LIB/CMakelist1)
这是可以接受的,还是有更好的现代CMake方式? 这个问题解决了,看起来很好

问题2:
Cmakelist1
使用
target\u link\u库构建静态库
/
target\u include\u目录
构造

在构建可执行子项目1时,我将LIB1作为

add_executable( SUBPROJECT1 )
target_link_libraries(SUBPROJECT1 PRIVATE LIB1)
当我编译SubProject1时,我得到boost/xyz和abc的include目录的编译错误。我将其作为PUBLIC include头包含在LIB1中

target_include_directory(LIB1 
     PUBLIC lib/include
     PUBLIC boost/include
     PUBLIC XYZ/include
     PUBLIC abc/include
如果LIB1的包含库和链接库被子项目1引用,我是否应该再次包含它们

例如: LIB/CMakeList1:

add_library(lib1 STATIC)
target_include_directory(lib1 
     PUBLIC lib/include
     PUBLIC boost/include
     PUBLIC XYZ/include
     PUBLIC abc/include
)
target_link_libraries(lib1 PUBLIC boost/lib1 xyz.a abc.so)
主要项目/CMakeList2:

add_subdirectory(../LIB1) #this works fine relative path is just for reference
add_subdirectory(subproject1)
add_subdirectory(subproject2)
子项目1/CMakeList3

add_executable( Proj1 )
target_sources( Proj1 x.cpp y.cpp z.cpp ) # these file have link to Lib1/xyz ->x1.h/y1.h etc

target_link_libraries( Proj1 PRIVATE lib1 ) 
我不想为
boost/xyz
abc
调用
target\u link\u库。

问题3:我是否需要为
boost/xyz
abc
再次在
子项目1
中明确添加
target\u link\u目录
,我不明白。给出的代码应该可以正常工作。你到底有什么问题?问题1:没关系。问题2:您可以,但您不能(?),您只需像您一样使用target_link_库(…lib1)链接库。问题3:不,这正是在cmake中继承可传递依赖项的目的。在编译过程中,尽管我在LIB1中链接了xyx和abc,但我必须在可执行文件{subproject1}中包含LIB1的头文件和链接库。很好,那就这样做吧。它有用吗?您认为
target\u link\u库
target\u include\u目录
中的
PRIVATE
PUBLIC
接口
用于什么?至于
,这很好,相对路径仅供参考
-只需传递两个参数,如
add_subdirectory(../LIB1 LIB1)
-第二个参数是CMAKE_BINARY_DIR中的名称,用于将编译结果放入其中。如果不起作用,请尝试传递绝对路径,如
target\u include\u目录(..${CMAKE\u CURRENT\u BINARY\u DIR}/lib/include)
。如果我在静态库中包含了一组头文件和库,我们是否需要使用target\u include\u*,将其再次包含在可执行文件中。从有关cmake的文献来看,它似乎应该无缝传播。@amit:请用您正在做的事情和确切的问题(例如错误消息)更新您的问题帖子。以目前的形式,你的问题无法得到回答,因为你的问题是什么还不清楚。另见。