이전에이 질문을했지만 다른 상황에서이 질문을했습니다. 나는 정적 C 라이브러리 B (libB
)로 연결되는 정적 C로 연결되는 C++ 응용 프로그램 (App
) ++ 라이브러리 A (libA
)를 가지고CMake가 공유 라이브러리의 링크 종속성을 내 실행 파일에 전파하지 않습니다.
# App CMakeLists.txt
add_executable(App ${APP_HEADER_FILES} ${APP_SOURCE_FILES})
target_link_libraries(App PUBLIC LibA)
# LibA CMakeLists.txt
add_library(LibA STATIC ${LIBA_HEADER_FILES} ${LIBA_SOURCE_FILES})
target_link_libraries(LibA PUBLIC LibB)
문제는 내가 App
를 빌드 할 때 내가 얻을 것입니다 링커 오류 : "error: undefined reference to mpfit"
. mpfit
은 libB
에있는 함수입니다. 내가 더 링커 오류가 발생하지 않습니다 (CMake에서 SHARED
와 STATIC
를 대체하여) 공유 LibA
을하면
- : 여기 지금 이상한 일입니다!
누구나 내가 공유 라이브러리를 모두 App
에 연결해야한다고 말했습니다. 나는 그것을 시도했고 실제로 효과가 있었다. 하지만 내 질문은 지금 여기에있다 :
- CMake가 자동으로 모든 링크 종속성을 실행 파일로 전파한다고 가정하지 않습니까? 이것은
target_link_libraries
함수의PUBLIC
키워드의 목적이 아닙니까? LibA
이 공유 라이브러리 일 때 왜 링커 오류가 발생하지 않습니까? 그 도움이된다면:
EDIT1 내가 nm libA
을 할 경우 내가 얻을 :
libA.cpp.o:
// ... blah blah ...
U mpfit
// ... blah blah ...
당신이'이 오류 수행에 의해 libB'used'에서 문자 to' 정의되지 않은 참조'libA' – UmNyobe
@UmNyobe 네, 정확히 – AstrOne
우리가 예를 들어 얘기하는 경우 예를 들어 Windows 플랫폼에서 [이상한 해결 방법] (https://github.com/Kitware/)이 있다는 것을 확인하기 위해 [자세한 출력] (http://stackoverflow.com/questions/37994484)을 사용할 수있는 GNU 도구 모음 CMake/blob/master/Modules/Platform/Windows-GNU.cmake # L133)이 있습니다. 일반적으로 '정적'과 '공유'의 차이점은 '공유'된 LibA가 실제로 LibB와 연결되어 있다는 것입니다. – Florian