3

我想创建一个依赖于另一个库的静态库,在这种情况下是 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.

有任何想法吗?

我能做些什么来强迫这个?

4

1 回答 1

2

在 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在这个过程中会有帮助的宏。您可能可以运行ar -xin execute_process(...),输出输出,然后运行ar -rc​​.

于 2012-04-13T06:58:13.887 回答