2017-10-11 22 views
0

나는 기존의 C++ 코드를 가지고 있으며, 다시 작성하려고합니다.일부 클래스가 나중에 dlopen에 의해 추가 될 것임을 C++ 링커에 알리는 방법

프로젝트의 코드 일부를 ".so"공유 라이브러리로 가져 와서 "dlopen"으로 동적으로로드하려고합니다.

필자는 런타임에 새로운 모듈을 동적으로로드 할 수있는 동적로드 메커니즘을 작성했습니다.

이제 주 프로젝트에서 기존 모듈을 분리하려고합니다.

예를 들어 주 프로젝트에서 모듈 "X"를 추출하고 나중에로드 할 수있는 공유 라이브러리를 만들었지 만 주 프로젝트의 일부는 모듈 X의 클래스를 직접 사용하므로 아직 변경할 수 없습니다.

모듈 X의 헤더 파일을 사용하여 프로젝트를 컴파일 할 수 있지만 링커에서 "정의되지 않은 참조"오류가 발생합니다.

어떻게하면 이러한 클래스가 런타임에 dlopen 메커니즘에 의해 나중에 추가 될 것이라고 C++ 링커에 알릴 수 있습니까?

참고 : 모듈 "X"의 ".so"파일을 "/ lib"폴더에 복사하여 프로젝트를 링크하고 실행할 수 있으며 "-lX"플래그로 링크 할 때 사용할 수 있지만이 파일 형식을 삭제하면/lib 폴더에서 시작시 프로젝트가 실패합니다.

답변

0

X 클래스를 직접 사용하면 프로그램에 X.so를 연결해야한다는 것을 알고 있습니다. 그러나 X.so를 링크하면 런타임에 dlopen을 사용할 수 있습니다.

+0

예,하지만 링크 종속성을 제거하고 싶습니다. 분리 된 모듈 함수를 호출하는 프록시 클래스로 X 클래스를 변경했습니다. – Emech

0

필요한 것은 가져 오기 라이브러리입니다. 그것들은 필요한 모든 함수를위한 작은 래퍼를 포함하고 모든 정적 링커 의존성을 만족시킵니다. 런타임에이 래퍼는 아직로드되지 않은 경우 동적 라이브러리를로드하고 라이브러리 내부의 실제 구현에 실행을 전달합니다.

가져 오기 라이브러리는 Windows DLL의 표준 기능이지만 Linux (또는 POSIX 시스템)에서는 즉시 사용할 수 없습니다. 래퍼를 직접 구현하거나 Implib.so을 사용하여 래퍼를 자동으로 생성 할 수 있습니다.