我有一个包含约600个目录的项目,其中包含约12个库和数十个程序的源代码。一些程序依赖于从文本文件生成的C ++头文件。
我如何干净地告诉CMake如何将生成的头文件的路径包含到那些需要它的源文件的包含路径中?
或者,在CMake尝试编译那些程序之前,如何强制将生成的文件安装到已知位置?(此想法基于当前的Makefile系统,该系统生成标头并将其安装到/ include目录中,所有源文件都可以找到该标头。)
还是有其他选择?
-编辑:添加了“玩具”示例-
本示例不起作用。我需要一种方法告诉prog1和prog2在哪里可以找到home.h。
我的树:
.
|-- prog1/
| |-- CMakeLists.txt
| `-- prog1.cpp
|-- prog2/
| |-- CMakeLists.txt
| `-- prog2.cpp
`-- share/
`-- dict/
|-- CMakeLists.txt
`-- gen.sh*
Run Code Online (Sandbox Code Playgroud)
分享/ dict:
cmake_minimum_required(VERSION 2.8.4)
project(dict)
set(SRC foo.c)
set(HEADERS foo.h home.h)
add_custom_target(home
ALL
DEPENDS ${CMAKE_INSTALL_PREFIX}/include/home.h
)
add_custom_command(
OUTPUT ${CMAKE_INSTALL_PREFIX}/include/home.h
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/gen.sh gen.sh
COMMAND gen.sh ${CMAKE_INSTALL_PREFIX}
)
add_library(dict ${SRC})
install(TARGETS dict DESTINATION lib)
install(FILES ${HEADERS} DESTINATION include)
Run Code Online (Sandbox Code Playgroud)
在prog1(以及类似的prog2)中:
cmake_minimum_required(VERSION 2.8.4)
project(prog1)
add_executable(prog1 prog1.cpp)
target_link_libraries(prog1 dict)
install(TARGETS prog1 DESTINATION bin)
Run Code Online (Sandbox Code Playgroud)
后
add_library(dict ${SRC})
Run Code Online (Sandbox Code Playgroud)
加
target_include_directories(dict
# The location of the headers before installation
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
# The location of the headers after installation
$<INSTALL_INTERFACE:include>
)
Run Code Online (Sandbox Code Playgroud)
并阅读我已经在评论中提供的链接。
| 归档时间: |
|
| 查看次数: |
4648 次 |
| 最近记录: |