나는 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()
방법이 두 가지의 링커 참조를 처리하는 모든 아이디어는 간단한 빌드
- 어쩌면 - 플랫폼 독립적 선?
와 LIBA의 경로를 확인합니다'는'target_link_libraries'해야 전화 find_library' 아니다 그것? – Tsyvarev
Lib A와 B는 종속적이지만 별도로 빌드하십시오. target_link_libraries를 사용하여 프로젝트를 연결할 기회가 없습니다. –
명령의 목적을 잘못 이해 했어야합니다. Target_link_libraries는 프로젝트가 생성 한 라이브러리를 컴파일하는 데 사용됩니다. Find_library는 외부 라이브러리를 찾는 것입니다. 당신은 그들을 섞어 버리고 있습니다. – usr1234567