2016-06-23 5 views
3

이전에이 질문을했지만 다른 상황에서이 질문을했습니다. 나는 정적 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". mpfitlibB에있는 함수입니다. 내가 더 링커 오류가 발생하지 않습니다 (CMake에서 SHAREDSTATIC를 대체하여) 공유 LibA을하면

  • : 여기 지금 이상한 일입니다!

누구나 내가 공유 라이브러리를 모두 App에 연결해야한다고 말했습니다. 나는 그것을 시도했고 실제로 효과가 있었다. 하지만 내 질문은 지금 여기에있다 :

  • CMake가 자동으로 모든 링크 종속성을 실행 파일로 전파한다고 가정하지 않습니까? 이것은 target_link_libraries 함수의 PUBLIC 키워드의 목적이 아닙니까?
  • LibA이 공유 라이브러리 일 때 왜 링커 오류가 발생하지 않습니까? 그 도움이된다면

    :

EDIT1 내가 nm libA을 할 경우 내가 얻을 :

libA.cpp.o: 
    // ... blah blah ... 
    U mpfit 
    // ... blah blah ... 
+0

당신이'이 오류 수행에 의해 libB'used'에서 문자 to' 정의되지 않은 참조'libA' – UmNyobe

+0

@UmNyobe 네, 정확히 – AstrOne

+0

우리가 예를 들어 얘기하는 경우 예를 들어 Windows 플랫폼에서 [이상한 해결 방법] (https://github.com/Kitware/)이 있다는 것을 확인하기 위해 [자세한 출력] (http://stackoverflow.com/questions/37994484)을 사용할 수있는 GNU 도구 모음 CMake/blob/master/Modules/Platform/Windows-GNU.cmake # L133)이 있습니다. 일반적으로 '정적'과 '공유'의 차이점은 '공유'된 LibA가 실제로 LibB와 연결되어 있다는 것입니다. – Florian

답변

1

그것은 libAlibB를 링크 할 때 링커가 아닌 참조 문자 떨어지고 있음을 확실히 가능합니다. 즉, App에 연결할 때까지 일부 기호는 libB입니다.

그런 경우 링커 옵션을 지정하여 첫 번째 연결에서 전체 libB을 유지할 수 있습니다. 예를 들어, gcc를 위해, 당신은 --whole-archive ld parameter