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 -xexecute_process(...)、出力をグロブしてから を実行できますar -rc

于 2012-04-13T06:58:13.887 に答える