2012-09-01 2 views
0

저는 C 멍청이입니다. 그래서 이것은 어리석은 질문 일 수 있습니다. ctypes 통해 파이썬으로 가져 오기위한 명시적인 목적으로 .so 파일 (공유 라이브러리, 내 용어가 올바른 경우)을 C 개체 (.o 파일)로 컴파일하려고합니다. 내가 먼저 컴파일 * 내가 함께 보상을했다하는 ctypes를 통해로드하려고 할 때이 점을 제외하고, 일-llibc을 찾을 수 없습니다.

gcc -shared -o libvARAM.so ARAM.o ARAM_io.o io.o pre.o rule.o stat.o ART.o vARAM.o 

로 .SO : 뒷조사 후

OSError: ./libvARAM.so: undefined symbol: max 

, 나는 최대 표준 아니라는 것을 깨달았 C 함수. ldd libvARAM.so을 호출하면 종속성 중 하나가 libc.so.6임을 알립니다. 나는 libc.so.6에 심볼릭 링크 libc.so를 생성 한 후 나는 또한 -L/lib/i386-linux-gnu/ -llibc을 시도하는 경우

/usr/bin/ld: cannot find -llibc 

이 같은 오류가 생성됩니다 생성 한

gcc -shared -o libvARAM.so ARAM.o ARAM_io.o io.o pre.o rule.o stat.o ART.o vARAM.o -llibc 

로 내 .so를 재 컴파일했습니다. 나는 this 스레드를 알고 있지만 해결책이 메이크 파일에 대한 것으로 내 상황과 관련이 없다고 생각합니다. 이 문제가 발생하면 저는 Xubuntu를 사용하고 있습니다.

모든 도움을 진심으로 감사드립니다.

+0

일부 GNU 소프트웨어를 컴파일 할 때 포함 된 (이식 된) 이식성 라이브러리는'libiberty.a '입니다. 물론 이것은'-liberty' 옵션과 함께 컴파일에 포함됩니다. (슬픈 그들이 자유를 빼고있다 슬픈,하지만 물론 옵션에 대한 관례입니다.) –

답변

2

하나 : 링커 플래그가 이와 같이 작동하지 않습니다. libXYZ.so의 경우 해당하는 링커 플래그는 -llibXYZ이 아니고 -lXYZ뿐입니다.

2 개 : C 표준 라이브러리 (-lc)가 실행 파일에 자동으로 연결되므로이 작업도 필요하지 않습니다.

세 : 문제가 가장 가능성이해야한다고하는 max()매크로 (함수와 반대) 헤더 파일 중 하나에 정의되어 있지만,이 헤더 파일을 포함하지 않기 때문에 컴파일러는 '아무튼 매크로라고 알고 함수로 취급합니다. 물론 libc.so에서 찾을 수 없습니다.

#ifdef UNIX 
#define min(x, y) (x<y ? x : y) 
#define max(x, y) (x<y ? y : x) 
#endif 

을 처음과 마지막 행을 제거 (즉, 더 ifdef 검사를 다음 없기 때문에

+0

.so 파일에 헤더 파일을 포함하는 것이 정상입니까? 헤더 파일이 .c 파일을 .o 파일로 컴파일하는 데 사용되었다고 생각했습니다. – learner

+0

@learner (페이스 잘린) 아니오. c 파일을 o 파일로 컴파일하려면 * 컴파일러 *를 사용합니다. ** 컴파일러! = 헤더 파일 **. 둘 중 하나는 헤더 파일을 .so 파일에 포함하지 않고 c 또는 다른 h 파일에 포함합니다. –

+0

명확히하기 위해 - 헤더 파일이 .c에서 .o로 컴파일하는 데 사용되었는지 묻는 것이 었습니다. 당신이 옳다 -'max' (그리고'min')은 별도의 헤더 파일에 매크로로 정의됩니다. 그러나이 헤더 파일 **은 ** 컴파일 과정에 포함되었습니다. 이 시점에서 무엇을해야할지 모르겠다. ... – learner

0

다른 새내기가 표시되면, 그들은 답을 볼 수 있도록이 게시 ... 기본적으로, 내 헤더 파일이었다) 컴파일러는이 정의를 읽을 수있었습니다. 명백하게 그것은 그것을 읽지 않고 있었다.

관련 문제