现代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:请用您正在做的事情和确切的问题(例如错误消息)更新您的问题帖子。以目前的形式,你的问题无法得到回答,因为你的问题是什么还不清楚。另见。