CMAKE - 如何正确地将静态库的头文件复制到/ usr / include中?

时间:2012-05-07 18:38:52

标签: c cmake static-libraries

我正在使用C进行CMAKE使用,实际上我正在创建两个非常小的静态库。

我的目标是:

  1. 编译库并将其链接到* .a文件中。 [这个 WORKS]
  2. 然后我希望将* .a文件复制到/ usr / local / lib [这也是工作]
  3. 据我所知,库(很少),它们是使用-lnameoflib链接的,#include <mylibheader.h>是一个编译器标志。好。我准备好了我的CMakeLists.txt,它实际上将* .a文件复制到/ usr / local / lib中。但是,为了能够在程序中使用它们,我还需要将它们的头文件复制到/ usr / include中,然后我可以轻松地将它们包含在make install中。这就是我现在理解的方式。
  4. 我的问题是 - 如何使用CMAKE将头文件复制到/ usr / include文件夹中?我希望在执行project(programming-network) add_library(programming-network STATIC send_string.c recv_line.c ) INSTALL(TARGETS programming-network DESTINATION "lib" ) 时自动复制它们,例如* .a文件。

    对于这两个库我都有一个熟悉的CMakeLists.txt:

    {{1}}

4 个答案:

答案 0 :(得分:30)

最新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 install command

答案 1 :(得分:11)

以更好的方式,将复制与模式匹配的所有文件并保留目录结构。

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

答案 2 :(得分:6)

我认为您的解决方案不正确。应为您的供应商保留/usr/include以放入文件。

执行IMO的正确方法是在/usr/local/include中安装标头,然后指示用户export CPATH="/usr/local/include:${CPATH}"

似乎/usr/local/lib是自动搜索但是如果你想使用另一个目录export LIBRARY_PATH="/usr/local/lib:${LIBRARY_PATH}"的工作类似于.a二进制文件(但根据你的操作系统,可能会或可能不适用于共享库)。

可选,但更麻烦的是在编译时添加-I /usr/local/include-L /usr/local/lib

这是一个有点主观的答案,但它对我来说效果很好。

答案 3 :(得分:2)

除了the accepted answer之外,如果您要创建很多库,并且eval(c1(1:c2-1))语法会使您失望。您可以将其包装在一个非常简单的宏中,例如:

set_property

然后您可以像使用它一样

# File: target_public_headers.cmake
macro(target_public_headers TARGET)
  set_target_properties(${TARGET} PROPERTIES PUBLIC_HEADER "${ARGN}")
endmacro()