2010-03-03 2 views
5

시나리오를 설명해 드리겠습니다. 우리는 레거시 C++ 컴파일 된 .so 라이브러리가 있습니다. 이 라이브러리의 함수는 extern "c" {}으로 선언되므로 C 및 C++ 프로그램에서 라이브러리를 사용할 수 있으며 어떤 이유로 든 --static-libgcc 옵션으로 생성되었습니다.기존 C++ .so 라이브러리를 대체하기 위해 C .so 라이브러리를 작성하는 방법?

이 오래된 라이브러리는 매우 오래되어 유지하기가 어렵습니다. 이제 우리는 그것을 관리 할 수 ​​있었지만 C 언어로 작성했습니다. 오래된 라이브러리를 libfoo.so (old)라고하고, 새로운 라이브러리를 libfoo.so (new)라고합니다. 주어진 bar.o에 대해 이전 또는 새로운 libfoo.so와 링크하여 실행 파일을 생성 할 수 있습니다 (예 : bar.exe). 그러나 bar.exe는 이전에 연결된 동일한 .so 라이브러리로만 실행할 수 있습니다. 즉,이 두 라이브러리는 상호 교환 할 수 없습니다.

EDIT # 1 : libfoo.so (old) 또는 libfoo.so (new)를 가리키는 libfoo.so라는 심볼릭 링크를 만들었습니다. 이 심볼릭 링크 libfoo.so는 런타임에 LD_LIBRARY_PATH에 있습니다.

편집 # 2 : 나는 오래된 libfoo.so 생성 된 bar.exe와 bar.o 연결했을 때 나는 새로운 libfoo.so이 bar.exe을 실행하면, 그것은 undefined symbols의 오류를보고했습니다. nm이 두 libfoo.so로, 나는 오래된 기호에서 이러한 기호를 찾을 수 있지만 새로운 기호에서는 찾을 수 없습니다. 심볼은 _ZSt4cerr과 같습니다. 이것은 C++ lib mangled 이름입니다. (비록 그것이 --static-libgcc에 의해 가져 왔지만) 새로운 libfoo.so는 그러한 종류의 심볼을 포함하지 않습니다.

EDIT # 3 : gcc 대신 g ++를 사용하여 C 코드를 컴파일하고 연결하면 어떤 의미입니까?

내가 이것을 어떻게 구현해야 하는가?

편집 # 4 : 오늘은,이 libfoo.so에 포함되는 모든 C++ 심볼로 이어질 수/컴파일 (정적 관하여 libgcc, 고정 된 libstdC++로) 새로운 C++에서 g와 libfoo을 프로그램시켜 연결할 수 있었다. 이렇게하면 모든 것을 원활하게 실행할 수 있지만 실제로 원하는 것은 아닙니다.

+0

왜 새 라이브러리에서 실행되지 않습니까? 어떤 종류의 오류 메시지가 나타 납니까? –

+0

그는 오류 메시지를받지 못합니다. 그는 무언가를 고치고있다. –

+0

EDIT # 2를 참조하십시오, 내 질문을 업데이트했습니다. 감사! – solotim

답변

0

같은 이름을 지정하고 다른 디렉토리에 넣습니다. LD_LIBRARY_PATH env를 사용하십시오. 다른 디렉토리보다 먼저 원하는 라이브러리로 디렉토리를 설정하십시오.

2

새 것으로 만들고 링크하면 이전 링크와 연결할 수 있습니까? 바이너리 호환 라이브러리를 생성 한 것처럼 보이지만 한 방향으로 만 보입니다.

+0

예. 새 라이브러리를 만들고 링크하면 생성 된 bar.exe는 이전 라이브러리와 새 라이브러리 모두에서 실행될 수 있습니다. 하지만 왜? – solotim

+0

이것은 새 라이브러리의 헤더 파일이 이전 라이브러리의 헤더 파일보다 적은 기호에 의존한다는 것을 의미합니다. http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html에서는 바이너리 호환 공유 라이브러리의 내용과 방법에 대해 좀 더 자세히 살펴볼 수 있습니다. – Jan

1

편집 # 2가 도움이됩니다.

기본적으로 bar.exe은 해당 라이브러리에 대한 C++ 런타임 초기화를 시도하고 있습니다.

bar.exe은 .so를 동적으로 검색하고 찾을 수 있도록 동일하게 변형 된 이름의 빈 구현을 제공해야합니다.

운이 좋지 않다면 실제로 이러한 함수가 의미있는 코드를 수행하여 성공으로 해석해야 할 수도 있습니다.

행운을 빌어 요

+0

아니면 간단 해답 C.so를 C++로 바꾸는 것이 실용적이지 않습니다 ...? :( – solotim

관련 문제