我有两个静态库: libfoo 和 libbar ,每个都在自己的目录中。
libfoo 包含includes/
目录,其中包含单个文件A.h
。它还包含一个sources/
目录,其中包含B.gen
。自定义规则应创建新标头B.h
和新源文件B.c
。
libbar 包含includes/
目录,其中包含单个文件C.h
。它还包含一个sources/
目录,其中包含C.c
。此文件包含A.h
和 libfoo 中的B.h
。
问题是:根据这些规则,如何编写两个库的CMakeFiles.txt(根据我的理解,棘手的部分是将所有libfoo头文件放在相同的目录中,但也许我会误导)?
文件层次结构:
/
libfoo/
includes/
A.h
sources/
A.c
B.gen
CMakeLists.txt
libbar/
includes/
C.h
sources/
C.c
CMakeLists.txt
答案 0 :(得分:1)
您不应将任何生成的文件复制到源目录。源目录和构建目录之间的分离是有意的,并且称为源外构建,以便在使用生成的文件构建期间不污染源目录。
在这种情况下你需要做的是:
定义一个自定义命令,使用add_custom_command将B.gen转换为B.h文件。这将在CMAKE_CURRENT_BINARY_DIR中生成B.h,它反映了CMakeLists.txt相对于项目根CMakeLists.txt的源目录。它看起来像这样:
add_custom_command(OUTPUT B.h 命令我的B.gen B.h. DEPENDS B.gen)
使用include_directories函数将生成文件的文件夹添加到include目录中。如果所有这些都是在一个CMakeLists.txt中完成的,那么您可以使用include_directories($ {CMAKE_CURRENT_BINARY_DIR})
CMake依赖解析器现在,一旦想要构建C.c,就会分析其内容,并发现构建它需要B.h.使用add_custom_command,您已告诉它如何创建该标头,它将调用您的生成器。
您应该查看源代码构建在CMake中的工作方式,以正确理解文件夹层次结构。