【发布时间】:2014-01-16 04:53:00
【问题描述】:
在 CMake 中如何处理这种编译情况?假设我们有一个包含子目录的源代码目录,例如
src:
helper:
innerpkg:
a.cpp
a.h
helper.cpp
helper.h
main.cpp
main.h
文件 a.cpp 调用文件 helper.cpp 中的内容,尽管 helper.cpp 可能不会调用 a.cpp 中的任何内容。因此,如果我们将 helper 子目录设为库,而将 innerpkg 设为库,我们会遇到一个问题,即 helper 需要包含 innerpkg,但 innerpkg 也需要 helper——一种循环依赖。处理这个问题的正确方法是什么,并且仍然在帮助程序中留下一些源文件?顺便说一句,我对使用 CMake 还是很陌生。
编辑:innerpkg 中的 CMakeLists.txt 文件可能如下所示:
include_directories(${CCMBS_SOURCE_DIR})
set(INNERPKG_SRC a.cpp)
add_library(innerpkg ${INNKERPKG_SRC})
在助手中:
include_directories(${PROJ_SOURCE_DIR})
add_subdirectory(innerpkg)
set(HELPER_SRC helper.cpp)
add_library(helper ${HELPER_SRC})
target_link_libraries(ui "-Wl,--whole-archive")
target_link_libraries(ui innerpkg)
target_link_libraries(ui "-Wl,--no-whole-archive")
以防万一。这些需要如何设置才能解决这个问题?
编辑:确切的依赖结构是这样的:innerpkg 中的东西依赖于 helper 中的东西。 innerpkg 由 main 使用。另一种情况是 helper 也依赖于 innerpkg 中的东西,即循环依赖,而 main 使用 helper 或 innerpkg。
【问题讨论】:
-
如果innerpkg不依赖于helper,为什么它位于helper中?
-
@Patrick B.:正如我所提到的,它调用了 helper.cpp 中的内容。还是您的意思是“助手不依赖于innerpkg”?它也可以在 helper 中实现接口或基类,所以它在它的目录中作为一个特定的实现。
-
为了更好地理解,也许您可以发布一个链接依赖关系图,显示谁需要做什么。或者你的 CMakeLists.txt。
-
好吧,“真实”程序的 CMakeLists.txt 比上面的插图更复杂,这只是说明了问题,因此需要深入研究“真实程序”的细节。不过,我想我可以为假设的示例程序提供一个虚构的 CMakeLists.txt。但是这个问题的重点是我不确定要放什么来处理我提到的那种依赖关系(子目录取决于父文件中的文件)。不过,我想我可以为目录“helper”提供一个。你想要那个吗?至于图表,我写的内容有什么不清楚的地方?
-
刚刚给出了简化的 CMakeLists.txt 示例。
标签: cmake