시나리오를 설명해 드리겠습니다. 우리는 레거시 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을 프로그램시켜 연결할 수 있었다. 이렇게하면 모든 것을 원활하게 실행할 수 있지만 실제로 원하는 것은 아닙니다.
왜 새 라이브러리에서 실행되지 않습니까? 어떤 종류의 오류 메시지가 나타 납니까? –
그는 오류 메시지를받지 못합니다. 그는 무언가를 고치고있다. –
EDIT # 2를 참조하십시오, 내 질문을 업데이트했습니다. 감사! – solotim