C++ CMake更改基于调用项目的库包含目录
以下是我当前的项目结构:C++ CMake更改基于调用项目的库包含目录,c++,cmake,C++,Cmake,以下是我当前的项目结构: ProjectX |_ projs |_ A ( builds an external project POO version 1 ) add_executable(A ${A_HDRS} ${A_SRCS} $<TARGET_OBJECTS:libbar>) |_ B ( builds an external project POO version 2 ) add_executable(B ${B_HDR
ProjectX
|_ projs
|_ A ( builds an external project POO version 1 )
add_executable(A ${A_HDRS} ${A_SRCS} $<TARGET_OBJECTS:libbar>)
|_ B ( builds an external project POO version 2 )
add_executable(B ${B_HDRS} ${B_SRCS} $<TARGET_OBJECTS:libbar>)
|
|_ libs
|_ libbar (objects only - no linking)
(needs POO either v1 or v2 depending on calling project)
issue lives here -->INCLUDE_DIRECTORIES(${POO_BUILD_DIR}/include)
add_library(bar OBJECT ${LIB_BAR_HDRS} ${LIB_BAR_SRCS})
ProjectX
|_projs
|_A(生成外部项目POO版本1)
添加可执行文件(A${A\U HDRS}${A\U SRCS}$)
|_B(构建外部项目POO版本2)
添加_可执行文件(B${B_HDRS}${B_SRCS}$)
|
|_自由基
|_libbar(仅对象-无链接)
(根据调用项目需要POO v1或v2)
此处存在问题-->包含目录(${POO\u BUILD\u DIR}/INCLUDE)
添加库(bar对象${LIB\u bar\u HDRS}${LIB\u bar\u SRCS})
目标:
我希望能够从顶层构建,包括所有项目,并使用正确的依赖项构建libbar。我希望能够有一个持续的建设过程
详情:
当项目A构建时,它需要用POO版本1编译libbar,当项目B构建时,它需要用POO版本2编译libbar。无论哪种情况,它仍然是《公安条例》的一个版本。我希望能够从A或B传递到libbar的路径
问题:
POO_BUILD_DIR路径因项目构建libbar而异。当我从顶层构建时,make首先尝试构建libbar,但没有找到正确的include
问题:
是否有人知道如何在cmake中实现这一点,或者我如何实现对构建顺序的更细粒度控制
更新和解决方案:
我遇到的问题可以用下面Chris的解决方案解决。然而,我的问题(我应该早就意识到)是,即使它位于库目录中,并且被称为库,它也不是库。命名和目录结构我无法更改b/c我不拥有代码库。但是,我可以改变我构建它的方式!我的quote unquote解决方案就是这样将文件包括到编译中:add_executable(A…${libbar\u hdrs}${libbar\u srcs}
故事的寓意
如果有人告诉你它是一个图书馆并命名它是一个图书馆,它可能不是。或者用一个口语表达“不要总是相信你所告诉的”。< / P > < P>你可以用很多方法来做,但是我在CGED C++项目中做的一种方式是,对于每一个库(我的项目根中的/LIB中的每个文件夹)我有一个辅助Cmake脚本来构建该库,我在主Cmake脚本中使用
add_子目录
来调用这些辅助Cmake脚本
下面是我的项目中的一个(开源)示例:
例如,如果您看这里,您将看到我是如何使用add_子目录实现“in-tree”(您所说的)libs的,而不是使用find_包实现“out-of-tree”(用户提供的)libs的
这就是我的第二个cmake脚本(在文件夹freetype-2.5.5中)的样子,它在您的情况下看起来会非常不同,但至少它是一个示例
请特别注意
集合最末端的一些行(FREETYPE_INCLUDE_DIRS${INCL}PARENT_SCOPE)
,如果这样做,可能需要使用这些行。CMake支持条件变量设置:@πάνταῥεῖ 您是不是建议我为每个调用项目都需要一个分支?我认为这将继续是一个问题。问题是库正在尝试首先构建,而此时我没有设置变量,因此编译失败。此外,库事先不知道include src dir将被称为什么。“此外,库没有提前知道include src dir将被称为什么。"我不知道这意味着什么。库实际上是否依赖于您的主要项目中的源文件?如果是这样,那么它通常不会被称为库。库是您外部依赖的东西,而不是依赖于您。好的,我重新阅读了您的问题。Drew:您应该在cmake sc的前面移动变量处理在调用add_子目录之前,配置变量将可用于辅助脚本。在我的示例项目中,许多库构建脚本依赖于用户或cmake在主构建脚本中设置的变量。关于您所说的我正在使用的代码如何是organi泽德。我把它人为地当作一个图书馆,这是我的问题——它不是真正的图书馆。我将用解决方案更新我的问题,以及试图把一个方形的钉子塞进一个圆形的洞的陷阱。谢谢你的帮助回答。
if (FREETYPE_IN_TREE)
add_subdirectory(lib/freetype-2.5.5 freetype-2.5.5)
else()
LIST(APPEND CMAKE_PREFIX_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib/freetype-2.5.5-old )
find_package(freetype NO_CMAKE_FIND_ROOT_PATH)
MESSAGE ( STATUS "FREETYPE found = " ${FREETYPE_FOUND} )
endif()