gpt4 book ai didi

static - 创建引用其他静态库的静态库

转载 作者:行者123 更新时间:2023-12-02 06:39:48 27 4
gpt4 key购买 nike

我想创建一个依赖于另一个库的静态库,在本例中为 ZLIB,我已经为其创建了一个静态构建 (libz.a)。

我有以下内容:

...
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
set (BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
set (CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) # to find the .a instead of the .so
...
find_package(ZLIB REQUIRED)
if (ZLIB_FOUND)
message(STATUS "ZLIB library: ${ZLIB_LIBRARIES}") # ZLIB library: /usr/lib64/libz.a
include_directories(${ZLIB_INCLUDE_DIRS})
set (EXT_LIBS ${EXT_LIBS} ${ZLIB_LIBRARIES})
endif()
...
add_library (libTest ${MCCORE_SOURCES_CC})
target_link_libraries(libTest ${EXT_LIBS}) #EXT_LIBS = /usr/lib64/libz.a

但是,构建的最后一步是创建静态库,但不引用 /usr/lib64/libz.a

例如:

/usr/bin/ar cr libTest.a  object1.o object2.o ... objectN.o 

我期望:

/usr/bin/ar cr libTest.a  object1.o object2.o ... objectN.o /usr/lib64/libz.a

最终的存档创建似乎并不关心使用 target_link_libraries 设置的库。

有什么想法吗?

我可以做什么来强制执行此操作?

最佳答案

在 Windows 下(使用 Visual Studio),以下内容即可解决问题:

add_library(fooStatic1 STATIC fooStatic.cpp)

set(LIBS_TO_COMBINE "${CMAKE_BINARY_DIR}/libfooStatic1.lib ${ZLIB_LIBRARIES}")

add_library(combined STATIC ${LIBS_TO_COMBINE} dummy.cpp) #dummy.cpp being empty
add_dependencies(combined fooStatic1)
set_source_files_properties(${LIBS_TO_COMBINE} PROPERTIES EXTERNAL_OBJECT TRUE GENERATED TRUE)
set_target_properties(combined PROPERTIES LINKER_LANGUAGE CXX)
set_target_properties(combined PROPERTIES STATIC_LIBRARY_FLAGS "${LIBS_TO_COMBINE}")

不幸的是,它在 Linux 下不起作用,因为 ar 只会合并存档文件而不解压它们 - 创建一些并不真正可用的东西。为了实现您的目标,您需要提取 .o 文件并重新组合它们:

ar -x /usr/lib64/libz.a
ar -x libfooStatic1.a
ar -rc libcombined.a *.o

我不知道 CMake 宏可以在此过程中提供帮助。您可以在 execute_process(...) 中运行 ar -x,glob 输出,然后运行 ​​ar -rc

关于static - 创建引用其他静态库的静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10129986/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com