Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为以下项目树创建CmakeList?_C_Cmake_Compilation_Shared Libraries - Fatal编程技术网

如何为以下项目树创建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

我正在处理一个库,它的树看起来像(为了简单起见,文件名已经更改了一点):

现在,我需要创建一个共享库,因此我将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/...
        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})