我正在使用C进行CMAKE使用,实际上我正在创建两个非常小的静态库。
我的目标是:
-lnameoflib
链接的,#include <mylibheader.h>
是一个编译器标志。好。我准备好了我的CMakeLists.txt,它实际上将* .a文件复制到/ usr / local / lib中。但是,为了能够在程序中使用它们,我还需要将它们的头文件复制到/ usr / include中,然后我可以轻松地将它们包含在make install
中。这就是我现在理解的方式。我的问题是 - 如何使用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}}
答案 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
)
一些参考:
答案 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()