RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 938188
Accepted
Luzifer
Luzifer
Asked:2020-01-29 21:57:07 +0000 UTC2020-01-29 21:57:07 +0000 UTC 2020-01-29 21:57:07 +0000 UTC

库的 CMake 配置

  • 772

大家好!

有一个任务

  1. 编写一个共享库(对于 windows .dll,对于 Linux .so)
  2. 库的头文件必须放在相应的文件夹中。(对于 Linux /usr/local/include/{library_name}/*)
  3. 应该可以在正在开发的应用程序中使用头文件。

目前我有 CMakeLists.txt

cmake_minimum_required(VERSION 3.13)

set(PROJECT_VERSION "0.0.1")

project(mylib VERSION ${PROJECT_VERSION})

set(CMAKE_CXX_STANDARD 17)

include(CMakeSources.cmake)
add_library(mylib SHARED ${MY_LIB_HEADERS} ${MY_LIB_SOURCES})

set_target_properties(mylib PROPERTIES
        VERSION ${PROJECT_VERSION}
        SOVERSION ${PROJECT_VERSION})

include(GNUInstallDirs)
set(MY_LIB_LIBRARY_DESTINATION ${CMAKE_INSTALL_LIBDIR})
set(MY_LIB_HEADERS_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib)

INSTALL(TARGETS mylib
        LIBRARY DESTINATION ${MY_LIB_LIBRARY_DESTINATION})

INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
        PUBLIC_HEADER DESTINATION ${MY_LIB_HEADERS_DESTINATION}
        FILES_MATCHING PATTERN "*.h")

几乎可以满足所有要求。第 3 点有错误。

例如:我有两个头文件Ah和Bh,Bh包含Ah(#include "Ah")。

执行 make install 命令后,这些文件被移动到

  • /usr/local/include/mylib/啊
  • /usr/local/include/mylib/Bh

现在,当我尝试在另一个项目中使用 Bh 时,我得到了错误

/usr/local/include/mylib/Bh:1:致命错误:找不到“Ah”文件#include“Ah”

请帮我解决这个问题。

cmake
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Fat-Zer
    2020-01-29T23:55:17Z2020-01-29T23:55:17Z

    二选一:

    • 或者#include <mylib/A.h>在您安装的标头中使用它。

    • 或者-I/usr/local/include/mylib/在编译其他项目时设置。

    在第一种情况下,为了在构建时使用相同的标头,您需要维护适当的项目结构:

    .
    ├── CMakeLists.txt
    ├── mylib
    │   ├── A.cpp
    │   ├── A.h
    │   ├── B.cpp
    │   ├── B.h
    │   ├── CMakeLists.txt
    │   └── CMakeSources.cmake
    └── README
    

    原版大致分为CMakeLists.txt两部分:

    ./CMakeLists.txt:

    cmake_minimum_required(VERSION 3.13)
    
    set(PROJECT_VERSION "0.0.1")
    
    project(mylib VERSION ${PROJECT_VERSION})
    
    set(CMAKE_CXX_STANDARD 17)
    
    include(GNUInstallDirs)
    
    set(MY_LIB_LIBRARY_DESTINATION "${CMAKE_INSTALL_LIBDIR}")
    set(MY_LIB_HEADERS_DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mylib")
    
    add_subdirectory(mylib)
    

    ./mylib/CMakeLists.txt:

    include(CMakeSources.cmake)
    include_directories ("${CMAKE_SOURCE_DIR}")
    
    add_library(mylib SHARED ${MY_LIB_HEADERS} ${MY_LIB_SOURCES})
    
    set_target_properties(mylib PROPERTIES
            VERSION "${PROJECT_VERSION}"
            SOVERSION "${PROJECT_VERSION}"
            PUBLIC_HEADER "${MY_LIB_HEADERS}")
    
    install(TARGETS mylib
            LIBRARY DESTINATION "${MY_LIB_LIBRARY_DESTINATION}"
            PUBLIC_HEADER DESTINATION "${MY_LIB_HEADERS_DESTINATION}")
    

    ./mylib/CMakeSources.txt:

    set(MY_LIB_HEADERS 
        A.h
        B.h
    )
    set(MY_LIB_SOURCES
        A.cpp
        B.cpp
    )
    

    由于您的审美偏好或需要,您可以将一些命令移动到更低/更高。

    • 3

相关问题

  • 如何正确地将编译标志传递给 cmake?

  • 如何在 ExternalProject (CMake) 中向标准 CONFIGURE_COMMAND 添加参数?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5