2012-12-08 2 views
5

오류없이 Python2.7을 정적으로 컴파일했습니다. 내 빌드를 테스트하기 위해, 나는 다음 코드를 사용 :Python - 컴파일 중 Py_Initialize가 해결되지 않았습니다.

#include "Python.h" 
int main() 
{ 
    Py_Initialize(); 
} 

을 그리고 나는 이런 식으로 컴파일 오전 :

$ gcc -static -I/path/to/python/header -L/path/to/my/staticpythonlib \ 
-lpython2.7 -ldl -l_all_other_needed_lib /tmp/my_previous_snippet.c -o myouput 

그러나, 오류가 발생했습니다. gcc는 유명한 undefined reference을 주장합니다.

TEST.C :(텍스트 + 0x1로). 'Py_Initialize'

호기심에 정의되지 않은 참조 내가 여기에 결과를 붙여되지 않습니다 (자세한 표시 플래그와 함께 GCC를 사용) 및 컴파일러 말하지만, 내 libpython을 사용하고 있지만 참조를 찾을 수 없습니다. Py_Initialize가 제대로 pythonrun.o에서 참조되는지,

$ nm /path/to/pythonlib |grep Py_Initialize 
frozenmain.o   U Py_Initialize 
pythonrun.o 0000009e9 T Py_Initialize 
pythonrun.o 000000052 T Py_Initialize_Ex 
main.o     U Py_Initialize 

우리는 볼 수 있습니다 그래서 난 내 정적 python2.7 라이브러리의 기호를 나열. 그러나 컴파일러가 올바른 개체 파일을 선택하는 방법을 모르겠습니다.

내 질문은 :

  1. 이 어떻게 확신 할 수 있습니다, 그 GCC 내 운영자와의 lib에 올바른 오브젝트 파일을 사용?
  2. 컴파일 옵션에 이상이 있습니까?

도움 주셔서 감사합니다.

+0

이이 연결되지 컴파일하는 동안 동안 발생하는 오류입니다. – alk

답변

6

주문 문제! 보다 구체적으로, gcc의 인수 순서가 중요합니다. 좀 더 구체적으로 말하면, bar 객체가 라이브러리 blehbluh 함수를 사용하는 경우 에 bluh을 gcc 찾기 할 이유가 없기 때문에 -lbleh bar.o의 순서는 문제가됩니다. 반면에 bar.o -lbleh을 사용하면 gcc는 bluh을 참조하며 -lbleh을 처리하면 종속성을 해결하려고 시도합니다. 이 내용은 http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html에서 빠르게 언급됩니다. 원칙적으로 항상 개체 뒤에 라이브러리를 지정합니다. 이제 gcc -static -I/usr/include/python2.7 -L/usr/lib/python2.7/config/ -lpython2.7 -ldl -lm -lutil -lz -pthread -o a1 a1.c

#include "Python.h" 

int main() 
{ 
    Py_Initialize(); 
    return 0; 
} 

을 컴파일 :

는 같이 파일 a1.c을 작성, 당신의 문제를 재현합니다. 이것은 Py_Initialize에 대한 정의되지 않은 참조를 제공합니다. 물론 설치 경로와 일치하도록 경로를 변경해야합니다.

대신 gcc -static -I/usr/include/python2.7 -L/usr/lib/python2.7/config/ -o a1 a1.c -lpython2.7 -ldl -lm -lutil -lz -pthread으로 컴파일하면 작동합니다 (가능한 많은 경고를 무시합니다. 다른 문제입니다).

1

저는 python 2.7을 사용하고 있으며 환경 변수에 python 설치 디렉토리의 경로를 설정하고 있습니다. 나는 또한 부스트 1.5를 사용한다.0

는 아래의 코드

#include <python2.7/Python.h> 
int main() 
{ 
Py_Initialize(); 

PyRun_SimpleString("print \"Hello, world!\""); 

Py_Finalize(); 
return 0; 
} 

실행을 명령을 컴파일하는 단계를 수행하십시오 -

g++ hello.cc -lpython2.7 
./a.out 
관련 문제