python - 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 SHARED
为add_library(MY_LIB STATIC
并获得了预期的 .a 文件。令人惊讶的是,这个文件在运行时只有 500 kB 并且缺少符号。
我假设 tensorflow 内容是共享库的一部分,但在静态库中以某种方式在外部引用。我需要配置什么才能获得完整的代码,而静态库中没有任何外部依赖项?
我在这里读到这两种库都包含整个代码。
谢谢。
解决方案
我假设 tensorflow 内容是共享库的一部分,但在静态库中以某种方式在外部引用。我需要配置什么才能获得完整的代码,而静态库中没有任何外部依赖项?
但是,如果您使用 CMake 来管理您的库,这不是问题,因为 CMake 会处理将所有必需的静态库以正确的顺序放置在链接行上。
1.(注意:在所有可能的情况下,包括我在内的所有链接答案都不正确)。
我在这里读到这两种库都包含整个代码。
这个答案是对静态库的可怕过度简化。静态库可能依赖于其他静态库。CMake 不会尝试将静态库合并到一个最终工件中。另一方面,将静态库链接到共享库会将两者合并在一起。
推荐阅读
- typescript - 如何在使用 TypeScript 编码的 cloudFunction 中更新 Firestore 中的地图
- database - 在 Docker 的 Localhost 中非常慢的数据库查询(在 RDS 中),但在 EC2 实例中非常快
- c# - 如何绘制圆角矩形作为圆角窗体的边框?
- c++ - 测试适用于成员变量的成员函数
- spring - 你如何在 Project Reactor 中实现轮询逻辑?
- arrays - 如何从 MongoDB 上的对象数组中创建 UNIQUE 属性
- javascript - 如何将 http.get() 的结果用于两个或多个非角度组件?
- swift - 为什么 SwiftUI 的 View Protocol 使用 PAT?
- python - 使用 TF_IDF 提取特征后如何使用朴素贝叶斯分类器
- azerothcore - 艾泽拉斯核心中交的XP计算在哪里