2013-07-24 2 views
3

CMake를 사용하여 컴파일 된 C++ 프로젝트에 파이썬 파일을 포함하려고합니다. 나는 모든 것이 잘 작동CMake를 사용하여 임베디드 파이썬으로 컴파일 + 가져 오기 오류

g++ $(python-config --cflags) -o test $(python-config --ldflags) ./test.cpp 

how to link python static library with my c++ program에서

#include <Python.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    setenv("PYTHONPATH", ".", 0); 
    char hostname[] = "localhost"; 
    PyObject *pName, *pModule, *pFunc; 
    PyObject *pArgs, *pValue; 
    Py_Initialize(); 
    pName = PyString_FromString("GetHostname"); 
    pModule = PyImport_Import(pName); 
    Py_DECREF(pName); 

    if(pModule != NULL) { 
    pFunc = PyObject_GetAttrString(pModule, "GetHostname"); 

    if (pFunc && PyCallable_Check(pFunc)) { 
     pArgs = PyTuple_New(1); 
     pValue = PyString_FromString(hostname); 
     PyTuple_SetItem(pArgs, 0, pValue); 
     pValue = PyObject_CallObject(pFunc, pArgs); 
     Py_DECREF(pArgs); 
     if (pValue != NULL) { 
    printf("The IP address is %s\n", PyString_AsString(pValue)); 
    Py_DECREF(pValue); 
     } 
     else { 
    Py_DECREF(pFunc); 
    Py_DECREF(pModule); 
    PyErr_Print(); 
    fprintf(stderr, "Call Failed\n"); 
    return 1; 
     } 
    } 
    else { 
     if (PyErr_Occurred()) 
    PyErr_Print(); 
     fprintf(stderr, "Cannot find function\n"); 
    } 
    Py_XDECREF(pFunc); 
    Py_DECREF(pModule); 
    } 
    else { 
    PyErr_Print(); 
    fprintf(stderr, "Failed to load file\n"); 
    return 1; 
    } 
    Py_Finalize(); 
    return 0; 
} 

그리고

import socket 

def GetHostname(hostname): 
    addr = socket.gethostbyname(hostname) 
    return addr 

사용하여 컴파일

는 우선이 두 파일을 사용하여이 독립을했다.

하지만이 때문에 내가 CMakeLists.txt에서

Traceback (most recent call last): 
    File "/src/GetHostname.py", line 1, in <module> 
    import socket 
    File "/usr/lib64/python2.6/socket.py", line 46, in <module> 
    import _socket 
ImportError: /usr/lib64/python2.6/lib-dynload/_socketmodule.so: undefined symbol: PyExc_ValueError 

내가 선을

find_package(PythonInterp REQUIRED) 
find_package(PythonLibs REQUIRED) 
include_directories (${PYTHON_INCLUDE_DIRS}) 
add_library (GetHostname MODULE GetHostname.cc) 
target_link_libraries(GetHostname ${PYTHON_LIBRARIES}) 
CONFIGURE_FILE(${PATH_TO_SOURCE}GetHostname.py ${PATH_TO_BUILD}GetHostname.py COPYONLY) 

기반을 추가 취득을 컴파일 한 후 뭔가 잘못하고 있어야합니다 CMake와 I를 사용하여 컴파일 된 프로젝트에 포함되어 있습니다 이 스레드에 Python.h: No such file or directory

모두 컴파일하지만 오류로 인해 파이썬 모듈을로드하지 못했습니다. 내가 CMake에서 파이썬 라이브러리를 올바르게 링크하지 않았습니까?

왜 실패했는지 설명 할 수있는 생각은 환영합니다. 파이썬 2.6

내가 그이 C에서 할 수 있습니다 알고 있어요 ++ 그러나 이것이 내가 C에서 다시 작성 그래서 포함 할 필요가있는 유일한 파이썬 모듈이 아닌 사용

++ 내가 찾고 대답하지 않습니다 . 또한 localhost의 IP 주소를 알고 있습니다. 이것은 테스트 목적으로 만 사용됩니다.

답변

1

그래서 마침내 대답을 찾았습니다.

CMake에서 링크 할 때 파이썬 라이브러리와의 연결은 로컬 (RTLD_LOCAL)에만로드되므로 실제 파이썬 스크립트는 파이썬 라이브러리와 연결되지 않고 C++ 만 연결된다는 것을 의미합니다.

이 문제를 해결하려면 C++ 코드에서 전역 심볼 해석을 사용하여 파이썬 라이브러리를로드하면됩니다.

dlopen("libpython2.6.so.1.0", RTLD_NOW | RTLD_NOLOAD | RTLD_GLOBAL); 

이 그것을 python2.6에 고유 한 것을 신속하고 더러운 수정, 당신은 컴퓨터에 설치된 버전을 기반으로 CMake에서 변수를 정의하여이 이식을해야합니다.

당신은 dlopen을 사용하는 dlfcn를 가져올 것입니다 :

#include <dlfcn.h> 
관련 문제