2012-04-12 2 views
2

Я хотел бы создать статическую библиотеку, которая зависит от другой библиотеки, в данном случае 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.

Любые идеи?

Что я могу сделать для этого?

+0

Итак, если я правильно понял, вы в основном хотите объединить две статические библиотеки? Ваша библиотека и некоторые другие? Зачем тебе это надо? Эти библиотеки будут связаны с исполняемым файлом. – Anonymous

+0

Я знаю, что это необычно, и что библиотеки будут полностью включены в исполняемый файл, но мне было предложено отправить статическую ссылку на библиотеку, и вы знаете, что клиент всегда прав. Правильно? – yorjo

+0

Я должен отправить ответ завтра утром. Я сделал что-то подобное. – Anonymous

ответ

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(...), glob выход, а затем запустить ar -rc.

Смежные вопросы