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将静态库合并到共享库中会将两者合并。
基于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?
但是,如果您使用 CMake 来管理您的库,这不是问题,因为 CMake 会处理将所有必需的静态库以正确的顺序放置在 link 行上。
1. (注意:link 编辑的答案中的 none,包括我的,在所有可能的情况下都是正确的)。
I've read here that both kinds of lib contains the whole code.
这个答案是对静态库的过度简化。静态库可能依赖于其他静态库。 CMake 没有尝试将 合并 静态库组合成一个最终的工件。另一方面,link将静态库合并到共享库中会将两者合并。