繁体   English   中英

CMAKE生成依赖共享库的static库

[英]CMAKE generate a static library that depends on shared libraries

首先,我正在学习,我对 CMake 很陌生,所以请怜悯。 我对此做了一些研究,但我没有发现任何对我有用的东西。 我对 CMakeLists.txt 做了很多更改,但我会尝试向您展示我正在尝试做的事情以及我是如何尝试实现的。

我有一个像这样的项目文件夹树:

Mainfolder/:
  CMakeLists.txt (CMakeLists1.txt to identify it better)
    lib1:
      source files (.h .c)
      CMakeLists.txt (CMakeLists2.txt)
    lib2:
      source files (.h .c)
      CMakeLists.txt (CMakeLists3.txt)
    executable:
      source files (.h .c)
      CMakeLists.txt (CMakeLists4.txt)

说完之后,lib1 和 lib2 将被构建为 static 库,例如依赖于“rt”和“pthread”共享库。 此外,lib2 依赖于 lib1。 我正在交叉编译,所以我使用和脚本加载环境,所有变量似乎都被 CMake 正确识别(我已经打印了它们,并通过编译在目标上正确运行的 Hello world 示例来验证交叉编译)。

CMakeLists1.txt 用作入口点:

project(
  MainApp
  VERSION 0.1
  DESCRIPTION "Main Application CMake compilation project"
  LANGUAGES C)

add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(executable)

如何编译 lib1 或 lib2? 使用以下 CMakeLists2.txt:

cmake_minimum_required(VERSION 3.14...3.16)

project(
  lib1
  VERSION 0.1
  DESCRIPTION "lib1 library"
  LANGUAGES C)

find_library(RT_LIBRARY rt)
find_library(PTHREAD_LIBRARY pthread)

list(APPEND SRCS
        source1.c
        source2.c)

find_library(RT_LIBRARY rt)
find_library(PTHREAD_LIBRARY pthread)

add_library(lib1 ${SRCS})

# Include libraries required
target_link_libraries(lib1 ${PTHREAD_LIBRARY} ${RT_LIBRARY})

CMakelists3.txt 与 CMakelists2.txt 相同,但包括 lib1 依赖项:

find_library(LIB1_LIBRARY lib1)
add_library(lib2 ${SRCS})
target_link_libraries(lib2 ${PTHREAD_LIBRARY} ${RT_LIBRARY} ${LIB1_LIBRARY})
target_include_directories (lib2 PUBLIC {CMAKE_CURRENT_SOURCE_DIR}/../lib1)

我不得不说我也尝试使用 ${CMAKE_CURRENT_SOURCE_DIR}/../lib1/liblib1.a 包含 lib1 依赖项,但它也没有用。

这些似乎编译得很好,我看到许多“U”未定义符号,我猜这些符号将从共享库中获得(抱歉,我在这里怀疑,我不确定是否应该将其视为失败)。 无论如何,我不确定 lib1 是否链接到 lib2,共享库(rt 和 pthread)也是如此。

最后,CMakeLists4.txt 旨在将所有内容放在一起并生成可执行文件:

cmake_minimum_required(VERSION 3.14...3.16)

project(
  Execuable
  VERSION 0.1
  DESCRIPTION "MainApp library"
  LANGUAGES C)

list(APPEND SRCS
        source1.c
        source2.c)

find_library(RT_LIBRARY rt)
find_library(PTHREAD_LIBRARY pthread)
find_library(RT_LIBRARY rt)
find_library(LIB1_LIBRARY lib1)
find_library(LIB2_LIBRARY lib2)

add_executable(Executable ${SRCS})
target_include_directories (Executable PUBLIC {CMAKE_CURRENT_SOURCE_DIR}/../lib1 {CMAKE_CURRENT_SOURCE_DIR}/../lib2)
target_link_libraries(Executable ${RT_LIBRARY} ${PTHREAD_LIBRARY} ${LIB1_LIBRARY} ${LIB2_LIBRARY})

如果我分别编译每个库,它们似乎会生成 properly.a 文件,但是当我尝试执行 CMakeLists1.txt 时,它在链接过程中失败,在 lib1.a 中显示未定义的引用,例如 shm_open (我发现它与“rt”共享库有关)。 所以,我不确定如何解决这种情况。 任何帮助都将非常受欢迎。

最好的问候,Fulgo。

Tsyvarev 给了我答案。 我必须避免对同一个 CMake 项目中构建的库使用 find_library。 这使我能够正确编译项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM