2016-12-21 7 views
0

g++으로 라이브러리를 컴파일했는데 gcc으로 링크하고 싶습니다.
문제는 링크하는 동안 오류가 발생하는 것이다 :공유 라이브러리의 심볼 주위에서 주변 문자를 제거하는 방법은 무엇입니까?

정의 참조 functionName` '에

함수이지만

(FUNCTIONNAME 라이브러리에서 함수 이름) 심볼 목록에 존재하며 링크하는 동안 gcc의 경로를 지정합니다.

함수가 (난이 오버라이드 (override)에 대한 생각?) 문자를 주변으로 목록에 나타납니다 때문에 발생합니다 Z12functionNameiSt9__va_list

나는 그게 내가 extern "C"와 함수 선언을 둘러싸고해야 이러한 문자를 제거하기 위해 알고 .

//header.hpp 
extern "C" int functionName(int argc, ...); 

그러나 주변의 문자가 여전히 기호 목록에서 함수 이름 주위에 나타납니다 그리고 나는 것을했다. 그리고 그 이유는 gcc 찾을 수 없습니다.

나는 우분투 데스크탑 (16)

arm-poky-linux-gnueabi-gccarm-poky-linux-gnueabi-g++와 리눅스 팔 yokto 크로스 컴파일이 왜 주변 문자가 제거되지 않는거야 어떻게 내가 그들을 제거 할 수 있습니까? 나는 결코이 함수를 오버라이드하지 않을 것이다. 그래서 이것이 정말로 오버 라이딩된다면 나는 그것들을 필요로하지 않는다.


편집 :

해결. 선언의 함수 시그니처가 정의의 시그니처와 다릅니다 ... 따라서 extern 키워드는 아무 것도 아닙니다.

int functionName(int argc, ...); //declaration 
int functionName(int argc, va_list args) //definition 
+0

아마도 # #include를 잊어 버렸을 것입니다. –

+0

@BasileStarynkevitch - 포함되어 있습니다. –

답변

1

이러한 문자는 이름 변경입니다. 그들은 C++ 오버로딩이 올바르게 작동 할 수 있도록 함수 시그니처를 인코딩합니다 (예 : int foo(int)int foo(float)은 다른 기호 임).

API가 C 인 경우 맹 글링을하지 않도록 라이브러리를 수정해야합니다. C로 작성하거나 코드에 extern "C"을 추가하십시오. API가 C++ 일 경우 헤더에서 extern "C"을 제거하십시오.

맹 글링 된 이름이 일치하지 않으면 (다른 맹 글링), 아마도 ABI 호환성 문제가있을 것입니다. 이 경우 링크 문제를 해결하는 것은 잘못된 해결책입니다. 대신 라이브러리와 동일한 ABI를 사용하여 코드를 작성해야합니다.

c++filt 도구는 변형 된 기호를 서명으로 디코딩 할 수 있어야합니다. 그 차이점을 알아내는 것이 유용 할 수 있습니다.

것은 당신이 g++로 라이브러리를 구축하고 gcc와 연결하려고하는 감안할 때, 그것은 당신이 C API와 장소에 extern "C"와 라이브러리를 다시 빌드를 할 가능성이 높습니다 당신이 필요합니다.

+0

API는 c (클래스 없음)이지만 함수는 C++ 라이브러리를 사용합니다. 나는 헤더에'extern "C"'를 추가했으나 (포스트를 보시오) 주변의 문자는 삭제하지 않았다. 함수 서명에 줄임표 ('...')가있을 수 있습니까? –

+0

@AlaaM. 아니요, 줄임표로 잘 작동합니다. 'extern "C"'가있는 라이브러리를 재 구축 했습니까? 귀하의 게시물에서 링커가'functionName'을 찾았지만 라이브러리에 문제가 있다는 것을 의미하는'Z12functionNameiSt9__va_list'가 라이브러리에 있다는 것을 압니다. 또한 라이브러리가 실제로 헤더를 포함하고 단순히'extern "C"'없이 함수를 정의하지 않는지 확인하십시오. – Olivier

+0

내가 게시물에서 말했듯이 문제는 도서관에 있다는 것을 알고 있습니다. 문제는 주변 문자 –

0

"주변 문자"는 실제로는 name mangling입니다. 따라서 맹 글링 된 이름은입니다.

당신은 아마 (당신이 더 C와 C++의 공통 부분 집합 코드 것이라는 점)이, 그리고 일치하여 (공개) 헤더 파일의 시작 근처

#ifdef __cplusplus 
extern "C" { 
#endif 

를 추가해야

#ifdef __cplusplus 
}; // end of extern "C" 
#endif 

끝 부분. this도 참조하십시오.

공용 헤더 (및 표준 C 헤더 포함)는 이러한 기능 (개별 기능은 아님)으로 포장해야합니다.

gcc -H으로 컴파일하여 포함 된 헤더를 나열하거나 g++ -C -E을 사용하여 사전 처리 된 양식을 얻고 검토 할 수 있습니다.

+0

내가 언급 한 것과 다른 점은 어떻게 이해할 수 있습니까? 이미'extern "C"'를 추가했습니다. –