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

다음 트릭 할 것 : 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}") 

, 그것은, 리눅스에서 작동하지 않습니다 - 뭔가를 만드는을 것을 정말 쓸모가 없어.

ar -x /usr/lib64/libz.a 
ar -x libfooStatic1.a 
ar -rc libcombined.a *.o 

나는 과정에서 데 유용한 CMake 매크로 인식하지 오전 : 당신의 목표를 달성하기 위해 당신은 .o 파일을 추출하고 재결합 할 필요가있다. execute_process(...)에서 ar -x을 실행하고 출력을 글로브 한 다음 ar -rc을 실행할 수 있습니다.

관련 문제