OS X을 사용하고 있으며 .so 파일을 실행 중에 .o 파일에 연결하려고합니다. 예를 들어 Foo.so는 ./Bar.o를 호출하는 동안 Bar.o에 연결되어야합니다. 터미널 응용 프로그램을 사용하여 응용 프로그램을 실행하고 Makefile을 사용하여 프로젝트를 컴파일했습니다.실행시 동적 라이브러리를 빌드에 연결하려면 어떻게해야합니까?
답변
Unix 및 OS X에서는 libdl을 사용하여이 작업을 수행 할 수 있습니다.
기본 아이디어는 실행 파일을 컴파일하고 링크하는 것입니다. 시간과 장소의 다른 시점에서, 공유 라이브러리를 컴파일하고 링크하지 않을 수도 있습니다. 런타임에 실행 파일이 공유 라이브러리 파일 이름과로드 할 함수의 심볼에 대한 문자열을 얻을 수있는 경우 libdl을 사용하여 공유 lib의 함수 주소를 포함하는 void *를 얻을 수 있습니다. 적절한 함수 포인터 타입은 컴파일 타임에 실행 파일에 알려 져야한다. 그 이유는 다음 단계는 void와 *를 실행 파일과 동적으로로드 된 lib 사이에 "은밀하게 미리 정렬 된"유형으로 캐스트하기 때문이다. 캐스팅 후에 당신은 잘 가게됩니다.
이 튜토리얼에서는 동적으로로드하는 기능에 대한 전통적인 접근법을 보여줍니다. 클래스는 팩토리 함수를 통한 간접 참조가 필요합니다. 시작 없지만, 그것이 실행 파일과 LIB 사이의 모든 통신 기능을하기 전에 통근 "C"로 만든 C 스타일 함수 서명을해야하는 단점이있다 (가장 크게 더 템플릿 또는 위치를
http://www.tldp.org/HOWTO/html_single/C++-dlopen/
접근 방식은 위이다 과부하). 이것은 실행 파일과 lib 사이의 통신 포트에 대한 제한 사항 일뿐입니다. 둘 다 내부적으로 C++을 사용할 수 있습니다. 오버로드 된 함수를 동적으로 가져 오려면 여기에 방법이 있습니다.
Dynamic Loading Without extern "C"
당신은 사용자 정의 클래스에주의해야한다. 클래스의 2 진 표현은 C++에서 표준화되지 않았습니다. 사용자 정의 클래스가 실행 가능 파일에서 lib로 전달되지만 실행 파일과 lib에는 어떤 비트가 의미가 다른지 다른 아이디어가 있으면 원하는 동작을 얻지 못합니다.
또한 OS X에서 공유 라이브러리를 컴파일하면 dylib가 생깁니다. 그들은 약간 다릅니다.
보통 -l 플래그로 컴파일합니다. 'g ++ Bar.cpp -l Foo.so -o Bar.o'. 작동하지 않습니까? 왜 너는 Foo가 필요한거야? 연결 되려면? 도움이 될만한 Makefile을 게시 할 수 있다면 ... – maditya
나는이 접근법을 제안 해왔다. 문제는, 내 Makefile이 cmake를 사용하여 생성되었으며 프로젝트가 매우 크다는 것입니다. Makefile 및 cmake에 대한 현재 지식에 따라 링크가 이루어지는 정확한 지점을 찾을 수 없습니다. – shaveenk
런타임에 연결할 수있는 방법이 없습니까? – shaveenk