CMake的 - 如何静态库的头文件中正确复制到/ usr / include目录?(CMAKE -

2019-07-29 07:46发布

我进入CMake的使用与C,实际上,我创建了两个非常小的静态库。

我的目标是:

  1. 该库被编译并链接到* .a文件。 [这工作]
  2. 然后,我希望到* .a文件复制到/ usr / local / lib目录[这也适用]
  3. 据我了解库(很少),他们使用链接-lnameoflib ,这是一个编译器标志。 好。 我已准备了我的CMakeLists.txt,它实际上拷贝* .a文件到/usr/local/lib 。 但是,为了能够在程序中使用它们,我也需要他们的头文件复制到/usr/local/include ,那么我可以包括它们的简单方法#include <mylibheader.h> 这就是我现在该怎么理解。

我的问题是 - 复制头文件到/ usr /的正确方式是如何包括与CMake的文件夹? 我想它的时候它们会自动复制make install执行,如* .a文件是。

对于这两个库的我有一个smiliar的CMakeLists.txt:

project(programming-network)

add_library(programming-network STATIC
    send_string.c
    recv_line.c
    )

INSTALL(TARGETS programming-network
        DESTINATION "lib"
        )

Answer 1:

对于最新版本的CMake一个更好的办法是使用目标的PUBLIC_HEADER属性。

project(myproject)

add_library(mylib some.c another.c)
set_target_properties(mylib PROPERTIES PUBLIC_HEADER "some.h;another.h")
INSTALL(TARGETS mylib 
        LIBRARY DESTINATION some/libpath
        PUBLIC_HEADER DESTINATION some/includepath
)

一些参考:

PUBLIC_HEADER

CMake的安装命令



Answer 2:

在一个更好的方法,将复制该模式匹配的所有文件和将保留目录结构。

INSTALL (
    DIRECTORY ${CMAKE_SOURCE_DIR}/include/
    DESTINATION include
    FILES_MATCHING PATTERN "*.h*")


Answer 3:

我不认为你的解决方案是正确的。 /usr/include应保留您的供应商把文件英寸

国际海事组织做正确的事情是安装在头部/usr/local/include ,然后指导用户export CPATH="/usr/local/include:${CPATH}"

这似乎/usr/local/lib自动被搜索,但如果你希望使用另外DIR export LIBRARY_PATH="/usr/local/lib:${LIBRARY_PATH}"工程,为.A二进制类似(但可能会或可能无法正常工作好共享库取决于你的操作系统)。

可选的,但更麻烦的是增加-I /usr/local/include-L /usr/local/lib ,而编译。

这是一个有些主观的答案,但它已经为我工作很好。



文章来源: CMAKE - How to properly copy static library's header file into /usr/include?