CMake:使用静态库在一个项目中构建多个可执行文件

德罗曼

我正在一个由3个服务器可执行文件和一个共享代码库组成的项目中。我希望它是跨平台的,所以我正在使用CMake(因为Xcode总是很痛苦)来处理构建过程。我在设置CMakeList时遇到了麻烦,因此在构建可执行文件时,可以从同一级别的目录中包含该库。

这是目录结构(和CMake文件):

tethealla2.0/
    CMakeLists.txt
    libtethealla/
        CMakeLists.txt
        encryption/
        utils/
    patch_server/
        CMakeLists.txt
    login_server/
        CMakeLists.txt
    ship_server/
        CMakeLists.txt

我的顶级CMake(tethealla2.0 / CMakeLists.txt,仅包括应编译的子项目):

project(tethealla CXX)
cmake_minimum_required(VERSION 2.6)

add_subdirectory(libtethealla)
add_subdirectory(patch_server)

tethealla2.0 / libtethealla / CMakeLists.txt,它生成一个静态库:

project(Libtethealla C)
cmake_minimum_required(VERSION 2.6)

include_directories(encryption)

set(ENC_DR encryption/)

set(ENCRYPTION_SOURCES 
  ${ENC_DR}/psobb-crypt.c
  ${ENC_DR}/psogc-crypt.c
  ${ENC_DR}/psobb-crypt.c
  ${ENC_DR}/encryption.c
  )

add_library(tethealla STATIC ${ENCRYPTION_SOURCES})

到目前为止,tethealla2.0 / patch_server / CMakeLists.txt:

project(patch_server CXX)
cmake_minimum_required(VERSION 2.6)

add_executable(server main.cc)
target_link_libraries(server tethealla)

因此,如果我从顶层构建它,则更有意义,因为tethealla2.0 / CMakeLists.txt将继承每个子目录的目标,而patch_server中的子目录将有权访问tethealla库。但是,我想要的是能够从这些子目录中构建生成Xcode项目,以便我可以分别处理/重新编译它们。为此,我需要能够进入libtethealla / build目录(CMake输出到该目录)以从patch_server访问libtethealla.a库。这可能吗?

还有一点需要注意的是,即使是从顶层目录构建,我在patch_server中的源也不能包含“ encryption.h”(加密库的头文件)。似乎一切正常。对此的任何想法也将不胜感激!

Luantkow

我的解决方案是将add_subdirectory与相对修补程序一起使用到shared_lib目录。我不认为这是一个完美的解决方案,但有以下警告:

  • 必须将与标头保护程序非常相似的逻辑添加到库CMakeLists.txt中,以防止多次定义目标。
  • 每个CMakeList.txt文件必须知道库的相对路径,如果要移动库,则必须更新所有CMakeList。

假设目录结构如下所示:

root/
    CMakeLists.txt
    shared_lib/
        CMakeLists.txt
        inc/
            foo.h
        src/
            foo.c
    exec1/
       CMakeLists.txt
       main.c
    exec2/
       CMakeLists.txt
       main.c

根目录/CMakeList.txt

cmake_minimum_required(VERSION 2.6)

add_subdirectory(shared_lib)

add_subdirectory(exec1)
add_subdirectory(exec2)

我已决定shared_lib / CMakeLists.txt将导出名为的变量SHARED_DIR_INCLUDE_DIR这种方法有助于使事物脱钩。

root / exec1 / CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

add_subdirectory(./../shared_lib shared_lib)

include_directories(${SHARED_LIB_INCLUDE_DIR})

set(SRCS main.c)
add_executable(exec1 ${SRCS})
target_link_libraries(exec1 shared_lib)

if()第四行解决了在多次添加CMakeLists文件的情况下目标的多重定义的问题。第二和第三行导出库中的include目录SHARED_LIB_INCLUDE_DIR

root / shared_lib / CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

set(SHARED_LIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/inc)

set(SHARED_LIB_INCLUDE_DIR ${SHARED_LIB_INCLUDE_DIR} PARENT_SCOPE)

if(TARGET shared_lib)

message("shared_lib is already defined")

else()

include_directories(${SHARED_LIB_INCLUDE_DIR})

set(LIB_SRCS ./src/foo.c)

add_library(shared_lib STATIC ${LIB_SRCS})

endif()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CMake:使用静态库在一个项目中构建多个可执行文件

来自分类Dev

CMake:防止在子目录库项目中构建测试可执行文件目标

来自分类Dev

将静态库的多个不兼容版本链接到一个可执行文件中

来自分类Dev

将静态库的多个不兼容版本链接到一个可执行文件中

来自分类Dev

CMake:是否可以仅从静态库而不从源构建可执行文件?

来自分类Dev

CMake:将静态库从子目录链接到另一个子目录中的可执行文件

来自分类Dev

我可以从一个项目中产生几个可执行文件吗?

来自分类Dev

尝试在Linux / Ubuntu上使用oracle库构建静态CGO可执行文件

来自分类Dev

链接可执行文件中的共享库与另一个共享库

来自分类Dev

创建一个可执行文件

来自分类Dev

创建一个可处理多个可执行文件的联机帮助页

来自分类Dev

在一个窗口中运行多个可执行文件

来自分类Dev

Cmake 项目中不存在 Qt 可执行文件

来自分类Dev

在TFS上构建要复制Node.js测试项目中的可执行文件

来自分类Dev

可执行文件的修改日期显示使用 cxfreeze 构建时的第一个构建日期。但是可执行文件运行最新版本

来自分类Dev

如何在IntelliJ idea Java项目中使用不同的输入文件运行同一可执行文件的多个实例

来自分类Dev

使用 LTO(链接时间优化)静态链接的可执行文件:如何使用以前构建的库制作它

来自分类Dev

CMake 项目结构:如何将库正确合并在一起并将它们包含在多个可执行文件中

来自分类Dev

有一个Lua IDE可以构建一个独立的可执行文件吗?

来自分类Dev

使用py2exe创建一个单文件可执行文件

来自分类Dev

用CMake编译静态可执行文件

来自分类Dev

Scons,仅从静态库构建C ++可执行文件

来自分类Dev

Scons,仅从静态库构建C ++可执行文件

来自分类Dev

CMake:将不同的OpenCV库链接到同一项目的不同可执行文件

来自分类Dev

CLion和CMake:仅构建没有可执行文件的库?

来自分类Dev

CMake OpenCV 3.0.0以及在Ubuntu中构建可执行文件和库

来自分类Dev

找到可执行文件的路径并将可执行文件存储在一个变量中

来自分类Dev

将Java项目构建为可执行文件

来自分类Dev

将Java项目构建为可执行文件

Related 相关文章

  1. 1

    CMake:使用静态库在一个项目中构建多个可执行文件

  2. 2

    CMake:防止在子目录库项目中构建测试可执行文件目标

  3. 3

    将静态库的多个不兼容版本链接到一个可执行文件中

  4. 4

    将静态库的多个不兼容版本链接到一个可执行文件中

  5. 5

    CMake:是否可以仅从静态库而不从源构建可执行文件?

  6. 6

    CMake:将静态库从子目录链接到另一个子目录中的可执行文件

  7. 7

    我可以从一个项目中产生几个可执行文件吗?

  8. 8

    尝试在Linux / Ubuntu上使用oracle库构建静态CGO可执行文件

  9. 9

    链接可执行文件中的共享库与另一个共享库

  10. 10

    创建一个可执行文件

  11. 11

    创建一个可处理多个可执行文件的联机帮助页

  12. 12

    在一个窗口中运行多个可执行文件

  13. 13

    Cmake 项目中不存在 Qt 可执行文件

  14. 14

    在TFS上构建要复制Node.js测试项目中的可执行文件

  15. 15

    可执行文件的修改日期显示使用 cxfreeze 构建时的第一个构建日期。但是可执行文件运行最新版本

  16. 16

    如何在IntelliJ idea Java项目中使用不同的输入文件运行同一可执行文件的多个实例

  17. 17

    使用 LTO(链接时间优化)静态链接的可执行文件:如何使用以前构建的库制作它

  18. 18

    CMake 项目结构:如何将库正确合并在一起并将它们包含在多个可执行文件中

  19. 19

    有一个Lua IDE可以构建一个独立的可执行文件吗?

  20. 20

    使用py2exe创建一个单文件可执行文件

  21. 21

    用CMake编译静态可执行文件

  22. 22

    Scons,仅从静态库构建C ++可执行文件

  23. 23

    Scons,仅从静态库构建C ++可执行文件

  24. 24

    CMake:将不同的OpenCV库链接到同一项目的不同可执行文件

  25. 25

    CLion和CMake:仅构建没有可执行文件的库?

  26. 26

    CMake OpenCV 3.0.0以及在Ubuntu中构建可执行文件和库

  27. 27

    找到可执行文件的路径并将可执行文件存储在一个变量中

  28. 28

    将Java项目构建为可执行文件

  29. 29

    将Java项目构建为可执行文件

热门标签

归档