如何为以下项目树创建CmakeList?
我正在处理一个库,它的树看起来像(为了简单起见,文件名已经更改了一点): 现在,我需要创建一个共享库,因此我将CmakeList编写为:如何为以下项目树创建CmakeList?,c,cmake,compilation,shared-libraries,C,Cmake,Compilation,Shared Libraries,我正在处理一个库,它的树看起来像(为了简单起见,文件名已经更改了一点): 现在,我需要创建一个共享库,因此我将CmakeList编写为: cmake_minimum_required(VERSION 3.5) project(module VERSION 1.0.0) include(GNUInstallDirs) add_library(module SHARED src/file00.c src/file01.c src/... s
cmake_minimum_required(VERSION 3.5)
project(module VERSION 1.0.0)
include(GNUInstallDirs)
add_library(module SHARED
src/file00.c
src/file01.c
src/...
src/...
src/filem.c
)
set_target_properties(module PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1
PUBLIC_HEADER include/proj_name/core.h)
target_include_directories(proj_name PRIVATE include)
target_include_directories(proj_name PRIVATE src)
install(TARGETS proj_name
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/proj_name)
问题从这里开始。此CMakeLists正在/usr/local(如预期)中生成共享对象,如下所示:
.
├── include
│ └── proj_name
│ └── core.h
└── lib
├── ...
├── libcore.so -> libcore.so.1
├── libcore.so.1 -> libcore.so.1.0.0
└── libcore.so.1.0.0
但是在include子目录中只复制core.h,要使用我的库,我必须手动将/include/proj_name/core
目录复制到/usr/local
中
问题1。有没有一种方法可以让我只在CMakeLists的帮助下完成这项工作?问题2。在未来,我计划扩展我的库,整个树(顶部)只是一个模块。如果要将库安装为:
/usr/local/include/proj_name/proj_name.h
/usr/local/include/proj_name/module1.h
/usr/local/include/proj_name/module2.h
...
我应该如何写CMakeLists
[编辑]:我忘了提到我未来的库的树结构:
.
├── include
│ └── proj_name
│ └── proj_name.h
├── module1
│ ├── CMakeLists.txt
│ ├── include
│ │ └── proj_name
│ │ ├── module1
│ │ │ ├── file00.h
│ │ │ └── file01.h
│ │ └── module1.h
│ └── src
│ ├── file00.c
│ └── file01.c
├── module2
│ ├── CMakeLists.txt
│ ├── include
│ │ └── proj_name
│ │ ├── module2
│ │ │ ├── file00.h
│ │ │ └── file01.h
│ │ └── module2.h
│ └── src
│ ├── file00.c
│ └── file01.c
└── module3
├── CMakeLists.txt
├── include
│ └── proj_name
│ ├── module3
│ │ ├── file00.h
│ │ └── file01.h
│ └── module3.h
└── src
├── file00.c
└── file01.c
多亏了@Tsyvarev,我自己能够做到以下几点,我只是在某种程度上感到困惑。我已经为未来的项目创建了一个带有样本的回购协议。因此,我在根节点创建了CmakeList,如下所示:
cmake_minimum_required(VERSION 3.5)
project(proj_name VERSION 1.0.0)
include(GNUInstallDirs)
add_subdirectory(module1)
add_subdirectory(module2)
add_subdirectory(module3)
add_library(proj_name SHARED
module1/src/file00.c module1/src/file01.c
module2/src/file00.c module2/src/file01.c
module3/src/file00.c module3/src/file01.c)
set_target_properties(proj_name PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1
PUBLIC_HEADER include/proj_name/proj_name.h)
install(TARGETS proj_name
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/proj_name)
至于模块中的那些CMakeLists.txt,它们类似于:
cmake_minimum_required(VERSION 3.5)
add_library(module1 SHARED src/file00.c src/file01.c)
set_target_properties(module1 PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1)
target_include_directories(module1 PUBLIC include)
target_include_directories(module1 PRIVATE src)
install(TARGETS module1
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(DIRECTORY "${CMAKE_SOURCE_DIR}/module1/include/proj_name"
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
现在,我认为所有的行都是自我解释的,更多信息请阅读自述
重要提示:
如果您有其他方法,请随时回答,因为我还没有结束问题。不确定问题出在哪里。只需在
PUBLIC_HEADER
属性中枚举include/proj_name/module1.h
和include/proj_name/module2.h
文件,就像您对include/proj_name/core.h
HEADER所做的那样。@Tsyvarev如果上面的问题不清楚,很抱歉。所以我想说的是关于这个问题#1我想编辑CmakeList,这样我就不必手动将include/proj_name/module*/*.h
文件复制到/usr/local
。关于第二个问题,我修改了我的问题。希望我的问题现在清楚了。还是不明白你的问题。您知道如何将单个标题include/proj_name/core.h
安装到/usr/local/include/proj_name/proj_name.h
中并成功安装。现在您还需要安装头文件/usr/local/include/proj_name/module1.h
和/usr/local/include/proj_name/module2.h
。使用相同的方法(PUBLIC\u HEADER
)安装头/usr/local/include/proj\u name/proj\u name.h
)有什么错呢?顺便说一句:目标包含目录(proj\u name PRIVATE include)
如果您想将库作为另一个项目的一部分包含进来,那么这是不切实际的。如果链接库的项目需要访问此include dir,则通过target\u link\u库
自动获得对这些标题的访问权。“请快速查看我在以下位置的错误…”-错误是关于缺少标头模块3/file00.h
。您没有安装该头,那么您还期望什么呢?看来我开始明白你的问题了。。。是否要在目录中安装所有标题,而不在CMakeLists.txt
中手动指定它们?如果这实际上是你的意图,那么看看这个问题:。
cmake_minimum_required(VERSION 3.5)
add_library(module1 SHARED src/file00.c src/file01.c)
set_target_properties(module1 PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 1)
target_include_directories(module1 PUBLIC include)
target_include_directories(module1 PRIVATE src)
install(TARGETS module1
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(DIRECTORY "${CMAKE_SOURCE_DIR}/module1/include/proj_name"
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})