CMake:静态库和共享库中的不同内容

CMake: Different content in static and shared lib

基于tensorflow lite minimal example,构建了一个小应用,想分享为lib。

我的 CmakeList 看起来像这样:

cmake_minimum_required(VERSION 3.16)
project(MY_LIB C CXX)

set(TENSORFLOW_SOURCE_DIR "" CACHE PATH
  "Directory that contains the TensorFlow project"
)
if(NOT TENSORFLOW_SOURCE_DIR)
  get_filename_component(TENSORFLOW_SOURCE_DIR
    "~/tensorflow"
    # "${CMAKE_CURRENT_LIST_DIR}/../../../../"
    ABSOLUTE
  )
endif()

add_subdirectory(
  "${TENSORFLOW_SOURCE_DIR}/tensorflow/lite"
  "${CMAKE_CURRENT_BINARY_DIR}/tensorflow-lite"
  EXCLUDE_FROM_ALL
)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../results)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../results)

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

add_library(MY_LIB SHARED
 src/my_code.cpp
)


target_link_libraries(MY_LIB
  tensorflow-lite
  ${CMAKE_DL_LIBS}
)

target_include_directories(MY_LIB PUBLIC
  inc
)


当 运行 build 时,我得到一个大约 5 MB 的 .so 文件,即使在没有 tensorflow (lite) 的机器上也能正常工作。

然后,我将 add_library(MY_LIB SHARED 替换为 add_library(MY_LIB STATIC 并获得预期的 .a 文件。令人惊讶的是,这个文件只有 500 kB 并且缺少符号,当 运行 它时

我假设 tensorflow 内容是共享库的一部分,但在静态库中以某种方式从外部引用。我需要配置什么才能获得完整代码,而静态库中没有任何外部依赖项?

我读过here这两种库都包含完整代码。

谢谢。

I assume that tensorflow content is part of shared lib, but referenced somehow externally in the static lib. What do I need to configure to get also the full code, without any external dependencies in the static lib?

is quite hard CMake.1

但是,如果您使用 CMake 来管理您的库,这不是问题,因为 CMake 会处理将所有必需的静态库以正确的顺序放置在 link 行上。

1. (注意:link 编辑的答案中的 none,包括我的,在所有可能的情况下都是正确的)。

I've read here that both kinds of lib contains the whole code.

这个答案是对静态库的过度简化。静态库可能依赖于其他静态库。 CMake 没有尝试将 合并 静态库组合成一个最终的工件。另一方面,link将静态库合并到共享库中会将两者合并