2015-04-09 3 views
0

Я работаю над проектом, который сочетает в себе Python 3 с C++, поэтому я решил работать с CMake + SWIG. У меня есть проблема, что когда я тип «сделать» с виртуальной средой активным, я получаю недостающие символы, потому что кажется, что версии Python найдено не совместимы:Комбинация Cmake/SWIG не очень хорошо работает в виртуальной среде

-- Found PythonInterp: /Users/aaragon/.virtualenvs/pydev/bin/python (found version "3.4.2") 
-- Found SWIG: /usr/local/bin/swig (found version "3.0.5") 
-- Found PythonLibs: /usr/lib/libpython3.4.dylib (found version "2.7.6") 

поэтому я получаю следующие ошибки:

Linking CXX shared module _core.so 
Undefined symbols for architecture x86_64: 
    "_PyClass_Type", referenced from: 
     SwigPyClientData_New(_object*) in corePYTHON_wrap.cxx.o 
    "_PyInstance_NewRaw", referenced from: 
     SWIG_Python_NewShadowInstance(SwigPyClientData*, _object*) in corePYTHON_wrap.cxx.o 
    "_PyInstance_Type", referenced from: 
     SWIG_Python_GetSwigThis(_object*) in corePYTHON_wrap.cxx.o 
    "_PyInt_AsLong", referenced from: 
     SWIG_AsVal_long(_object*, long*) in corePYTHON_wrap.cxx.o 
     SWIG_AsVal_unsigned_SS_long(_object*, unsigned long*) in corePYTHON_wrap.cxx.o 
     SWIG_AsVal_double(_object*, double*) in corePYTHON_wrap.cxx.o 
    "_PyInt_FromLong", referenced from: 
     SWIG_From_int(int) in corePYTHON_wrap.cxx.o 
    "_PyInt_FromSize_t", referenced from: 
     SWIG_From_unsigned_SS_int(unsigned int) in corePYTHON_wrap.cxx.o 
    "_PyString_AsString", referenced from: 
     SWIG_Python_str_AsChar(_object*) in corePYTHON_wrap.cxx.o 
    "_PyString_AsStringAndSize", referenced from: 
     SWIG_AsCharPtrAndSize(_object*, char**, unsigned long*, int*) in corePYTHON_wrap.cxx.o 
    "_PyString_ConcatAndDel", referenced from: 
     SwigPyObject_repr(SwigPyObject*) in corePYTHON_wrap.cxx.o 
     swig_varlink_str(swig_varlinkobject*) in corePYTHON_wrap.cxx.o 
    "_PyString_Format", referenced from: 
     SwigPyObject_format(char const*, SwigPyObject*) in corePYTHON_wrap.cxx.o 
    "_PyString_FromFormat", referenced from: 
     SwigPyObject_repr(SwigPyObject*) in corePYTHON_wrap.cxx.o 
     SwigPyPacked_repr(SwigPyPacked*) in corePYTHON_wrap.cxx.o 
     SwigPyPacked_str(SwigPyPacked*) in corePYTHON_wrap.cxx.o 
    "_PyString_FromString", referenced from: 
     SWIG_Python_str_FromChar(char const*) in corePYTHON_wrap.cxx.o 
     swig_varlink_repr(swig_varlinkobject*) in corePYTHON_wrap.cxx.o 
     swig_varlink_str(swig_varlinkobject*) in corePYTHON_wrap.cxx.o 
    "_PyString_FromStringAndSize", referenced from: 
     SWIG_FromCharPtrAndSize(char const*, unsigned long) in corePYTHON_wrap.cxx.o 
    "_Py_InitModule4_64", referenced from: 
     _init_core in corePYTHON_wrap.cxx.o 
     SWIG_Python_SetModule(swig_module_info*) in corePYTHON_wrap.cxx.o 
    "__PyInstance_Lookup", referenced from: 
     SWIG_Python_GetSwigThis(_object*) in corePYTHON_wrap.cxx.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[3]: *** [_core.so] Error 1 
make[2]: *** [CMakeFiles/_core.dir/all] Error 2 
make[1]: *** [all] Error 2 
make: *** [core] Error 2 

Когда я вне окружающей среды все работает отлично:

-- Found PythonInterp: /usr/bin/python (found version "2.7.6") 
-- Found SWIG: /usr/local/bin/swig (found version "3.0.5") 
-- Found PythonLibs: /usr/lib/libpython2.7.dylib (found version "2.7.6") 

за то, что я не хочу работать с Python 2.7.6, за исключением, но с Python 3. есть ли способустранить эту ошибку? Это код, который я сейчас использую в CMakeLists.txt:

# find Python 
find_package(PythonInterp) 

# find SWIG 
find_package(SWIG REQUIRED) 
include(${SWIG_USE_FILE}) 

find_package(PythonLibs) 
include_directories(${PYTHON_INCLUDE_PATH}) 

message(STATUS "PYTHON_INCLUDE_PATH: ${PYTHON_INCLUDE_PATH}") 
message(STATUS "PYTHON_LIBRARIES: ${PYTHON_LIBRARIES}") 

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/core) 
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/core/fem) 

#set(CMAKE_SWIG_OUTDIR ${PROJECT_BINARY_DIR}/../lib/hybrida) 


SET_SOURCE_FILES_PROPERTIES(swig/core.i PROPERTIES CPLUSPLUS ON) 
set_source_files_properties(swig/core.i SWIG_FLAGS "-includeall;-c++;-shadow") 
swig_add_module(core python swig/core.i core/foo.cpp) 
swig_link_libraries(core hybrida_core ${PYTHON_LIBRARIES}) 

ответ

0

Создайте виртуальную среду с необходимой версией Python:

virtualenv --python /path/to/python <venv_dir> 
+0

Это не работает. Я создал virtualenv с помощью ленивой обертки следующим образом: '$ mkvirtualenv --python =/usr/local/bin/python3 pydev3', но он все равно не работает. – aaragon

Смежные вопросы