CMake:将头文件复制到输出目录

Jim*_* B. 5 c++ build cmake

我有一个包含 c++ 源文件和头文件的目录。我想创建一个 CMakeLists.txt 来将其构建为库,以便在将其作为子目录包含的其他 CMake 项目中使用。

结构:

example/
    foo.h
    foo.cpp
    CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是 CMake 似乎没有将 foo.h 放在任何地方,因此让父 CMake 知道如何查找头文件让我很困惑。

这是我当前的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.8.2)
project(example)
set (CMAKE_CXX_STANDARD 11)

# add library target foo
add_library(foo STATIC foo.cpp)

# tell cmake where to find headers for it
target_include_directories(foo PUBLIC .)

# sad attempt to get it to output the header
set_target_properties(foo PROPERTIES PUBLIC_HEADER foo.h)
Run Code Online (Sandbox Code Playgroud)

我不想安装。这里的想法是该库将由其他 CMake 项目使用,而不是由整个系统使用。

理想情况下,foo.h 将显示在构建目录中的 libfoo.a 旁边。

我曾尝试将其称为“框架”,但没有成功;只做一个 macOS 框架。

我相信我可以临时操纵这个,但我认为有一个最佳实践。

也接受“这里有更好的方法”的答案......

更新

这可能有助于澄清我想如何将这个项目拖入另一个项目。我见过其他项目使用这样的东西:

add_subdirectory(<path_to_foo>/foo foo_build)
Run Code Online (Sandbox Code Playgroud)

这会导致 foo 构建发生在子目录中。这使我可以使用“foo_build”引用该库,这非常干净。但是,我仍然必须指向原始包含目录才能获取 .h 文件,这让我觉得我错过了一些东西。

看起来 cmake 对此有一个干净的解决方案。

nat*_*soz 4

我对 CMake 相当陌生,但我认为你想要的是“ add_custom_command ”。

add_custom_command(TARGET foo.a POST_BUILD COMMAND copy foo.h ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
Run Code Online (Sandbox Code Playgroud)

这可能有用。