Я работаю над проектом, который сочетает в себе 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})
Это не работает. Я создал virtualenv с помощью ленивой обертки следующим образом: '$ mkvirtualenv --python =/usr/local/bin/python3 pydev3', но он все равно не работает. – aaragon