2012-04-12 9 views
2

静的ライブラリ(libz.a)を既に持っている別のライブラリ(この場合はZLIB)に依存する静的ライブラリを作成したいと思います。他の静的ライブラリを参照する静的ライブラリを作成してください

... 
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で設定されたライブラリは気にしないようです。

アイデア?

これを強制するにはどうすればよいですか? (Visual Studioに)は、Windowsの下で

+0

私が正しく理解していれば、基本的に2つの静的ライブラリをマージしたいのですか?あなたの図書館やその他の?なぜそれが必要ですか?これらのライブラリは実行可能ファイルにリンクされます。 – Anonymous

+0

私はライブラリが完全に実行可能ファイルに含まれていることは珍しいことですが、ライブラリの静的リンクバージョンを出荷するように要求されており、お客様は常に正しいことを知っています。右? – yorjo

+0

明日の朝に答えるべきです。私は似たようなことをやった。 – Anonymous

答えて

2

次は、トリックを行うだろう:arはちょうどそれらを開梱せずにアーカイブファイルを結合しますよう

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 -x /usr/lib64/libz.a 
ar -x libfooStatic1.a 
ar -rc libcombined.a *.o 

私はプロセスに役立つだろうCMakeマクロを認識していない午前:あなたの目標を達成するために、あなたは.oファイルを抽出し、それらを再結合する必要があります。あなたはおそらくar -xexecute_process(...)で実行し、出力をグローブしてからar -rcを実行します。

関連する問題