我目前有一个非常大的文件结构,我想将其移植到cMake,但不幸的是,我很难找到类似于我目前正在使用的文件结构的示例。
( _ _。c / h表示任何文件名)
Project
Target
<*.s19/*.elf goes here>
Component1
src
file.c
file.h
____.c
____.h
cfg
____.c
____.h
out
<*.o goes here>
tmp
<*.d goes here>
Component2
src
file.c
file.h
____.c
____.h
cfg
____.c
____.h
out
<*.o goes here>
tmp
<*.d goes here>
Component3
src
file.c
file.h
____.c
____.h
cfg
____.c
____.h
out
<*.o goes here>
tmp
<*.d goes here>
另外,我如何告诉它在某个组件中查找包含,例如我希望组件1中的文件只在Component2中查找#includes。另外,我如何告诉它只在某个文件列表中编译,例如在src中,我可能只希望它在file1.c中编译,而不是在file2.c中编译
答案 0 :(得分:0)
如何在不同的组件中使用不同的include目录(在@ruslo和@steveire的帮助下):
在主CMakeLists.txt中按正确的顺序添加组件:
add_subdirectory(Component1)
add_subdirectory(Component2)
在Component1 / CMakeLists.txt中为生成的库添加一个属性::
cmake_minimum_required(VERSION 2.8.11)
...
add_library(Component1 ${Component1_SOURCES})
target_include_directories(Component1 INTERFACE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
... other required includes
)
在Component2 / CMakeLists.txt中使用target_include_directories
作为Component2:
cmake_minimum_required(VERSION 2.8.11)
...
add_executable(Component2 ${Component2_SOURCES})
target_link_libraries(Component2 Component1)
关于要编译的文件的确切列表。坦率地说,我认为这方面没有任何问题。只需在add_executable
或add_library
指令中明确指定它们:
add_binary(Component1Binary test1.c test2.c test5.c)
但是我应该提一下,传统的CMake使用稍微不同的布局来编译工件。它将编译的工件放在源目录中,或者您可以创建一个完全分离的目录,它将所有编译的工件放在那里,完全复制您的项目结构。看看:
MyProject/
CMakeLists.txt <- the top-level CMakeLists.txt. It may simply `add_subdirectory()`s (for each of its `Components`) and configure project-wide settings
Component1/
CMakeLists.txt <- this is intented to build artifact(s) for Component1
src1-1.c
src1-1.h
...
Component2/
CMakeLists.txt <- this is intented to build artifact(s) for Component2
src2-1.c
src2-1.h
...
现在您可以在文件系统中创建一个具有任意名称(例如,build.release
) where 的空目录(通常在MyProject中的某个位置但不是必需的),然后cd
到那个目录并像这样调用cmake:
cmake [cmake flags like -DCMAKE_BUILD_TYPE=Release and others] path/to/the/MyProject
然后,CMake会在此目录中创建所有必需的Makefile-s和其他构建工件,如果您选择使用make
而不是{{ninja
,则可以调用ninja
(或make
1}})并且所有构建工件都将驻留在该目录中,再现MyProject
的原始结构:
build.release/
Component1/
src1-1.o
...
Component1.a
Component2/
src2-1.o
...
Component2Exe
等
有关$<BUILD_INTERFACE:...>
内容的更多信息在docs,How to set include_directories from a CMakeLists.txt file?等。此功能相对较新,我仍然不确定我是否完全正确地执行了所有操作(测试示例确实编译了)