首页 > 解决方案 > CMake:静态和共享库中的不同内容

问题描述

基于 t ensorflow lite 最小示例,我构建了一个小应用程序并希望将其作为 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 SHAREDadd_library(MY_LIB STATIC并获得了预期的 .a 文件。令人惊讶的是,这个文件在运行时只有 500 kB 并且缺少符号。

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

我在这里读到这两种库都包含整个代码。

谢谢。

标签: pythoncmakestatic-libraries

解决方案


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

CMake 真的 很难 做到_ _ 1

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

1.(注意:在所有可能的情况下,包括我在内的所有链接答案都不正确)。

我在这里读到这两种库都包含整个代码。

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


推荐阅读