2012-11-07 5 views
2

다른 여러 라이브러리를 기반으로하는 C++ 공유 라이브러리를 작성했습니다. 이제 라이브러리를 사용할 때 '외부'라이브러리의 기능과 관련하여 많은 정의되지 않은 참조가 발생합니다. g ++ 명령에 'foreign'libs를 명시 적으로 추가하면 컴파일 및 링크가 올바르게 작동합니다. 라이브러리 사용자가 '외부'라이브러리와 수동으로 연결할 필요가 없도록이 문제에 대처할 수 있습니까?공유 라이브러리의 외부 라이브러리

도움 주셔서 감사합니다.

답변

1

공유 라이브러리의 사용자가 라이브러리의 모든 링크 종속성을 선언하지 않도록하려면 공유 라이브러리 자체를 빌드 할 때 이미 해당 종속성을 링커에 알릴 수 있습니다. 메이크에서

,이 같을 것이다 :

mylib.so: 
    g++ -o mylib.so $OBJS -llib1 -llib2 -llib3 

그런 mylib.so의 사용자는 lib1, lib2 또는 lib3를 지정할 필요가 없습니다,하지만 그들은 여전히 ​​오른쪽 (가능해야합니다 버전)을 실행할 수 있습니다.

0

게시 된 (내 보낸) 인터페이스에서 모든 외부 데이터 유형 및 기능을 제외해야합니다. 즉, GCC의 경우 -fvisibility=hidden을 사용하여 모든 구현 세부 정보를 숨길 수 있으므로 attribute ((dllexport)을 사용하여 부품 만 내보내십시오. Pimpl idiom (일명 Opaque pointer)은 게시 된 헤더에서 종속성을 제거하는 데 도움을줍니다. 아래 빠른 예 :

#include<memory>  

#if EXPORT_DLL 
    #define DLL_PREFIX __attribute__ ((dllexport)) 
#else 
    #define DLL_PREFIX __attribute__ ((dllimport)) 
#endif 

class XImpl; 

class DLL_PREFIX X { 
//... 
private: 
    std::unique_ptr<XImpl> impl_; 
} 

정의하고 구현하여 다른 헤더/소스 XImpl 그리고 그게 다야. 너의 것에서 만 다른 libs에서 연결 의존성 없음. 그러나 런타임 의존성은 여전히 ​​존재합니다!

+0

답장을 보내 주셔서 감사합니다.하지만 저는 그것을 모호하게 이해하지 못합니다. 내 라이브러리의 인터페이스 클래스가 iface.hpp이고 구현이 iface.cpp에 있다고 가정합니다.이 파일에서 외부 라이브러리가 호출됩니다. 당신의 솔루션을 어떻게 구현합니까? – user1801173

+0

iface.hpp는'X' 정의와'XImpl'의 forward 선언 (erarlier)을 포함하고 iface.cpp는'XImpl' 정의를 포함하거나 외부 헤더를 포함 할 수 있습니다. 그래서 init과'impl_' 필드를 전달하고 모든 메소드를 전달합니다. 예를 들어 X에'void f()'메소드가있는 경우 XImpl에 비슷한 메소드를 추가하고 인터페이스 클래스에서'f()'를 구현하면서 iface.cpp에서 호출하여 실제 작업을 수행해야합니다. –

+0

좋아, 그래서 iface 클래스에 모든 호출을 전달하는 새로운 클래스를 작성한다. 그러나 iface의 일부 함수 호출에는 외국어로 제공되는 유형의 매개 변수가 있습니다. 따라서 관련 헤더를 포함해야합니다. 그리고 나도 같은 시점에있어? – user1801173

관련 문제