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()