2012-06-20 5 views
2

확인을 클릭하면 문제가 해결되지 않을 수 있습니다. -lyajl을 사용하여 C++ 프로그램을 C 공유 라이브러리 (YAJL로 이름 지정)와 연결하려고합니다. 링커는 (은 그것에 대해 불평하지 않습니다)을 찾을 것으로 보인다하지만 난 내 코드에서 사용하는 기호를 찾을 수 없습니다 : g ++에서 링크를 찾을 때 기호를 찾을 수 없습니다.

$> g++ test.c -lyajl 

Undefined symbols for architecture x86_64: 
    "yajl_tree_parse(char const*, char*, unsigned long)", referenced from: 
     _main in ccEqsAaJ.o 
    "yajl_tree_get(yajl_val_s*, char const**, yajl_type)", referenced from: 
     _main in ccEqsAaJ.o 
    "yajl_tree_free(yajl_val_s*)", referenced from: 
     _main in ccEqsAaJ.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
$> 

내가 동작을 분리하는 미니멀 TEST.C 파일을했다. 그럼, 아주 이상한 것은 (덧붙여 말하자면, TEST.C 그냥 C 코드, 여기에 기능 ++없는 C처럼) GCC 코드와 완벽하게 OK 것이다 :

$> gcc test.c -lyajl 
$> 

그 g을하고 GCC입니다 ++하지 않는 것 같습니다 무엇 할 수있는 권리?

답변

3

libyajl.so의 심볼이 C 링키지이지만 코드 (또는 사용중인 헤더 파일)가 extern "C"을 선언하지 않았습니까? 이 경우 C++로 코드를 컴파일하면 객체 파일에 name-mangled symbols이 생기므로 라이브러리에있는 (C 연결, 변형되지 않은) 심볼과 일치하지 않게됩니다.

이 솔루션은 다음과 같이 헤더 파일에 뭔가를 작성하는 것입니다 : 그것을 해결되지

#ifdef __cplusplus 
// "__cplusplus" is defined whenever it's a C++ compiler, 
// not a C compiler, that is doing the compiling. 
extern "C" { 
#endif 

// Exchange "void" with the real return type for these functions 
void yajl_tree_parse(char const*, char*, unsigned long); 
void yajl_tree_get(yajl_val_s*, char const**, yajl_type); 
void yajl_tree_free(yajl_val_s*); 

#ifdef __cplusplus 
} 
#endif 
+0

예, 그게 전부입니다. 감사 ! – Fabien

3

extern "C" 경우이를 시도합니다.

정적 라이브러리 -libyajl_s.a에 연결하는 데 동일한 문제가있었습니다. yajl 소스를 실행 파일 으로 컴파일하여이 문제를 해결할 수는 있지만 정적 라이브러리가 필요했습니다. yajl 소스를 면밀히 살펴보면 소스가 헤더가 두 개의 별도 폴더 (예 :
#include <api/yajl_parse.h>
#include "yajl_parser.h"

#include <api/yajl_tree.h> 링커는 yajl_tree.c에서의 정의에 yajl_tree.h에서가 아니라 자신의 프로토 타입 yajl_tree_parse, yajl_tree_get 및 yajl_tree_free를 해결 것으로 보인다. 즉, 결과 라이브러리에서 정의되지 않은 상태로 유지됩니다.

솔루션

SRC 폴더에 API를 폴더에서 모든 헤더를 이동하고 <api/...>에 대한 모든 참조를 제거하는 것이었다. 그런 다음 링커는 yajl_tree_xxx 함수 정의를 올바르게 선택했습니다.

+0

고마워, 나도 이것 좀 봐. – Fabien

관련 문제