创建一个引用其他静态库的静态库

时间:2012-04-12 18:58:44

标签: static cmake

我想创建一个依赖于另一个库的静态库,在本例中是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设置的库。

有什么想法吗?

我该怎么做才能强迫这个?

1 个答案:

答案 0 :(得分: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 -x中运行execute_process(...),输出结果,然后运行ar -rc