2017-01-10 1 views
0

나는 cmake에서 링크 된 libs를 다루는 좋은 방법을 찾고있다. 필자의 경우 cmake 구성 파일 (CMakeLists.txt)은 Linux 환경과 Windows의 cygwin에서 실행됩니다. 빌드 프로세스에는 두 개의 lib가 포함되어 있습니다. libA는 소스에서 빌드되며 std에만 의존합니다. C API. libB는 소스에서 빌드되었으며 libA를 포함합니다. libs는 별도로 빌드되며 (자체 git repro를 사용하여) 빌드됩니다. "libB/CMakeLists.txt"다중 플랫폼 cmake 빌드에서 라이브러리를 검색하는 방법은 무엇입니까?

find_library (libB A) 

내가 LIBA에 대해 libB 연결시에 cmake에 정의함으로써

. cygwin에서 링크 할 때이 줄은 실패합니다. 변경하면

find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a) 

으로 바뀝니다.

두 라이브러리 모두 공유 라이브러리로 빌드됩니다.

"LIBA/CMakeLists.txt"

add_library(libA SHARED ${libA_source}) 
install(
     TARGETS libA 
     RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} 
     LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} 
     ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static 
    ) 

"libB/CMakeLists.txt는"리눅스에서

add_library(libB SHARED ${libB_source}) 
install(
     TARGETS libB 
     RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} 
     LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} 
     ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static 
    ) 

이 잘 작동합니다. libs는 "/ user/local/lib"에 저장됩니다. Windows에서 lib는 "/ user/local/lib/shared"에 위치하며 + dll은 "/ user/local/bin"에 저장됩니다.

LIBA에 대해 libB을 연결하는 문 ("libB/CMakeLists.txt")로 변경 :

if (UNIX) 
    find_library (libB A) 
elseif (CYGWIN) 
    find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a) 
endif() 
방법이 두 가지의 링커 참조를 처리하는 모든 아이디어는 간단한 빌드

- 어쩌면 - 플랫폼 독립적 선?

+1

와 LIBA의 경로를 확인합니다'는'target_link_libraries'해야 전화 find_library' 아니다 그것? – Tsyvarev

+0

Lib A와 B는 종속적이지만 별도로 빌드하십시오. target_link_libraries를 사용하여 프로젝트를 연결할 기회가 없습니다. –

+1

명령의 목적을 잘못 이해 했어야합니다. Target_link_libraries는 프로젝트가 생성 한 라이브러리를 컴파일하는 데 사용됩니다. Find_library는 외부 라이브러리를 찾는 것입니다. 당신은 그들을 섞어 버리고 있습니다. – usr1234567

답변

1

이것은 당신의 libB/CMakeLists.txt 내에서 작동한다 :

find_library(libA 
      NAMES A libA libA.so libA.dll libA.dll.a 
      HINTS ${CMAKE_INSTALL_FULL_LIBDIR} 
) 
target_link_libraries(libB ${libA}) 

가 대신

message(STATUS "libA=${libA}") 
관련 문제