bar.so
의 함수를 사용하는 정적 라이브러리 foo.a
에서 작업하고 있다고 가정 해 봅시다.정적 라이브러리에서 공유 라이브러리를 사용하여 최종 사용자가 이들 라이브러리에 링크하지 않고 사용하는 방법은 무엇입니까?
프로젝트에서 foo.a
을 사용하는 사람이 누구나 bar.so
에 명시 적으로 연결할 필요가 없도록이 라이브러리를 빌드하려면 어떻게해야합니까?
bar.so
의 함수를 사용하는 정적 라이브러리 foo.a
에서 작업하고 있다고 가정 해 봅시다.정적 라이브러리에서 공유 라이브러리를 사용하여 최종 사용자가 이들 라이브러리에 링크하지 않고 사용하는 방법은 무엇입니까?
프로젝트에서 foo.a
을 사용하는 사람이 누구나 bar.so
에 명시 적으로 연결할 필요가 없도록이 라이브러리를 빌드하려면 어떻게해야합니까?
libfoo.a
에서 수행 할 수있는 작업은 dlopen
을 호출하여 libbar.so
을 동적으로 연결하는 것입니다. 그런 다음 dlsym
을 사용하여 사용할 기능을 찾으십시오.
typedef void (*BarFunctionType) (const char *);
FunctionType barFunction;
void initialize_foo_lib() {
void *h = dlopen("libbar.so", RTLD_LAZY);
BarFunctionType barFunction = (BarFunctionType) dlsym(h, "barFunction");
// Note scary looking cast to get your function pointer.
//... rest of code can call barFunction now
}
libbar.so
는 C 라이브러리를해야한다, 또는 당신이 제대로 함수 이름을 찾기위한 함수는 C++ 라이브러리의 경우 extern "C"
해야한다. 그렇지 않으면 dlsym
으로 함수를 찾기 위해 이름을 맹 글링해야합니다. 라이브러리의 objdump -T
을 사용하여 라이브러리의 이름이 잘못 표시되었는지 확인할 수 있습니다.
실현 아직 libbar.so
에 대한 의존성이 있지만 정적 라이브러리에 구워집니다. 따라서 libfoo.a
사용자는 -lfoo
에 링크 할 때 -lbar
을 링크 라인에 추가 할 필요가 없습니다.
확장 프로그램에서 볼 때 유닉스 방식을 찾고 있습니다. 내 지식으로는 g ++ 및 clang ++ 모두이 작업을 수행 할 수 없습니다.
비주얼 C++는 아마 그것을 할 수 - 난 단지 정적 라이브러리, DLL 않은 그것을 사용하지만, 한 ...
나는 SFML가 -lX11 또는 링크 저를 필요로하지 않기 때문에이 가능합니다 알고 -lGL. – Overv
예를 들어'bar.a'에 대한 정적 라이브러리를 얻지 않는 한, 이것을 할 수 없다는 것을 확신합니다. (이미 다른 질문에서 말했듯이, 나는 할 수 없습니다. 'SFML' 또는'XLib'에 익숙하지 않기 때문에 더 많은 정보를 얻을 수 있습니다.) –
목표는 무엇입니까? 좀 더 편리하기 때문에 링크 타임에'bar.so'에 대한 참조를 피하고 싶습니까? 아니면 다시 연결하지 않고'bar.so'와'someother.so'를 바꿀 수 있기를 원합니 까? –