2014-10-12 4 views
0

automake에 의해 컴파일 된 C 프로젝트의 함수에 의해 호출되는 foo() (extern c로 선언 된) 함수를 가진 공유 라이브러리 (C++)가 있습니다. 그래서 나는 make.am 파일을 include.am으로 보내 hv/... /Release/lib/libabc.so라는 이름과 위치를 xyz_LDADD 변수에 추가했다. 정확히 내가 가지고있다. xyz_LDADD = libabc.soautomake로 정의되지 않은 참조

foo는의 선언은 다음과 같습니다

#ifdef __cplusplus 
extern "C" { 
#endif 
void foo(void); 
#ifdef __cplusplus 
} 
#endif 

내가 만들려고

, 난() 오류 foo는에 정의되지 않은 참조를 가져옵니다.

d 라이브러리 abc의 이름을 변경하면 오류가 발생하므로 컴파일러가 라이브러리를 찾을 수 있다고 가정합니다.

정적 라이브러리도 제대로 작동합니다. 아무도 도와 줄 수 있습니다 .. 미리 감사드립니다

+1

시도해 보셨습니까 :'xyz_LDADD = -L /../ Release/lib/-labc'? (일반적으로 라이브러리의 전체 이름을 넣지 않고 "lib"다음의 부분과 ".so"앞에 붙이십시오. – Galik

+0

예, 시도하지 않았습니다. (여전히 정의되지 않은 참조 오류 :(다른 제안 사항은 무엇입니까? ?? – deesha

답변

0

C에서 호출하면 C++ 메서드는 extern "C" 또는 extern "C" 블록으로 선언해야합니다. 헤더 프로토 타입뿐만 아니라 소스에도 있습니다.

nm 도구에서 foo 기호를 찾으려는 이유인지 확인하십시오. 이 같은

: 어떤 추가없이, 다음 foo 방법은 extern "C" 선언과 C 코드에서 사용할 수 있습니다

nm ../Release/lib/libabc.so | grep foo

당신이 foo 단어가 표시되는 경우. 이름 앞뒤에 추가 문자가있는 경우에는 C++로 표시되고 C 코드에서는 사용할 수 없습니다.

+0

예 foo()의 정의에 extern C가 있기 때문에 추가 문자없이 봅니다. ( – deesha

+0

@ tahl90 undefined (U)로 보일 수 있습니다. 본문이있는 함수의 코드를 제공해야합니다. 당신이 준 헤더 선언은 함수 자체가 어떻게 선언되었는지를 보여주지 않았고, 여러분이'nm'의 출력을 주면 도움이 될 것입니다. – SHR