2016-04-06 19 views
3

Ich versuche Swig zu verwenden mit shared library mit Python. Ich bin nicht sehr mit C++ experimentiert, aber ich habe einen ersten Test mit einem einfachen Objekt (in C++) gemacht und das funktioniert gut.Python und C++ 11 für swig: wie aktivieren C++ 11

Jetzt versuche ich, es mit einem größeren Projekt arbeiten, die bereits unter Linux (und Windows) kompilieren. Aber ich kann es nicht funktionieren lassen. Hier

ist das, was ich versuche haben:

Mein CMakeLists für Swig:

project(elecswig) 

include_directories(${COREALPI_DIR}/include) 
include_directories(/usr/include/c++/4.9) 

find_package(SWIG REQUIRED) 
include(${SWIG_USE_FILE}) 
if (NOT MSVC) 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
endif() 

find_package(PythonLibs) 
include_directories(${PYTHON_INCLUDE_PATH}) 

set_source_files_properties(src/elec.i PROPERTIES CPLUSPLUS ON) 
set_source_files_properties(src/elec.i PROPERTIES SWIG_FLAGS "-includeall") 

link_directories(${COREALPI_LIBRARY}) 

swig_add_module(elecswig python src/elec.i) 

swig_link_libraries(elecswig 
    ${PYTHON_LIBRARIES} 
    elec 
) 

Und mein elec.i für Swig, die eine .h mit Namespace nennen:

#define __linux__ 1 
#define __GNUC__ 4 

%module elecswig 
%{ 
    #include "ca/elec/model/modelvoltagedrop.h" 
%} 

%include "ca/elec/model/modelvoltagedrop.h" 

Und wenn ich versuche, zu kompilieren, um meine Python Lybrary zu bekommen, habe ich den folgenden Fehler:

/usr/include/c++/4.9/bits/c++0x_warning.h:32: Error: CPP #error "This file requires compiler and library support for the \ 
ISO C++ 2011 standard. This support is currently experimental, and must be \ 
enabled with the -std=c++11 or -std=gnu++11 compiler options.". Use the -cpperraswarn option to continue swig processing. 
/usr/include/c++/4.9/cstring:41: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/string:38: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/stringfwd.h:39: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/memoryfwd.h:48: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/stl_algobase.h:59: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/functexcept.h:39: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/cpp_type_traits.h:37: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/ext/type_traits.h:34: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/move.h:33: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/concept_check.h:35: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/stl_iterator_base_types.h:64: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/cwchar:41: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/allocator.h:46: Error: Unable to find 'bits/c++allocator.h' 
/usr/include/c++/4.9/bits/localefwd.h:39: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/bits/localefwd.h:40: Error: Unable to find 'bits/c++locale.h' 
/usr/include/c++/4.9/iosfwd:38: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/cctype:41: Error: Unable to find 'bits/c++config.h' 
[...] 
/usr/include/c++/4.9/cstdlib:41: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/utility:68: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/ctime:41: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/ctime:42: Error: Unable to find 'time.h' 
/usr/include/c++/4.9/iomanip:38: Error: Unable to find 'bits/c++config.h' 
/usr/include/c++/4.9/numeric:60: Error: Unable to find 'bits/c++config.h' 
elecswig/CMakeFiles/_elecswig.dir/build.make:53: recipe for target 'elecswig/elecPYTHON_wrap.cxx' failed 
make[2]: *** [elecswig/elecPYTHON_wrap.cxx] Error 1 
CMakeFiles/Makefile2:75: recipe for target 'elecswig/CMakeFiles/_elecswig.dir/all' failed 
make[1]: *** [elecswig/CMakeFiles/_elecswig.dir/all] Error 2 
Makefile:75: recipe for target 'all' failed 
make: *** [all] Error 2 

Es scheint, dass er nicht viele files.h finden kann, aber ich habe meistens den C++ 11 Fehler.

Ich habe versucht, Flags in CMake zu setzen, aber es scheint nichts zu ändern.

Wenn Sie mir bitte helfen können?

Ich kann bei Bedarf weitere Informationen zur Verfügung stellen.

Dank

+0

Etwas ist seltsam mit Ihrem Compiler/cmake Setup, wenn Sie 'include_directories (/ usr/include/C++/4.9)' explizit schreiben müssen. – Flexo

+0

Ich kann jedoch nicht Ihr Problem reproduzieren, ich habe fast eine identische CMake-Datei als die notierte Änderung, die funktioniert. Ich denke, dass Ihr Compiler selbst auf eine seltsame Art und Weise gebrochen sein kann, wenn die anderen Fehler auftreten. – Flexo

+0

Das Seltsame ist, dass ich dieses Projekt (mit C++ 11 Flagge) kompilieren kann, ohne swig zu benutzen ... also warum, wenn ich swig benutze, erzähle er mir das. Ich habe eine andere Maschine versucht, und ich bekomme den gleichen Fehler. – Algorys

Antwort

1

Nach Stunden des Tests fand ich Grund, warum es nicht funktioniert wurde. In den CMakeLists:

alle Bibliotheken und Abhängigkeiten, sowieso Compiler verwenden. Und wenn Sie 2 Versionen von libstdC++ und gcc/g ++ haben, scheint es, dass er die guten Bibliotheken nicht finden kann, die verlinkt/verwendet werden.

Wenn ich es entferne, erledigt CMake die Arbeit. Ich habe keine unable to find oder c++11 Probleme mehr.

Ich muss g ++ - 5 verwenden, damit es funktioniert (4.9 scheint einige Funktionen für C++ 11 zu verpassen) und fügen Sie den guten Namespace und Include hinzu.

Jetzt habe ich Zugriff auf meine freigegebene Bibliothek in Python.

+0

Diese Antwort erläutert nicht, wie die C++ 11-Unterstützung für SWiG-Module ordnungsgemäß aktiviert wird. Die Verwendung von "-std = C++ 11" ist ein Workaround, der nicht überall funktioniert. CMake verfügt über einen generischen Mechanismus, der C++ 11 erfordert, indem eine Zieleigenschaft festgelegt wird. Angesichts des Titels der Frage würde eine gute Antwort angeben, wie dies generisch zu lösen ist. –

+0

Es hat für mich funktioniert. Vielen Dank. – warchantua

0

Für das Protokoll, um die Frage zu beantworten, die im Titel dieses Beitrags gefragt wird (was der ursprüngliche Autor hatte tatsächlich von dem Problem unterscheidet):

Mit dieser Erklärung statt CMAKE_CXX_FLAGS der Einstellung:

set_property(TARGET ${SWIG_MODULE_elecswig_REAL_NAME} PROPERTY CXX_STANDARD_REQUIRED 11) 
+0

Ich habe deine Lösung mit einem anderen Projekt versucht, aber CMake warnt immer noch ... '$ {SWIG_MODULE_elecswig_REAL_NAME}' scheint für mich leer zu sein – Algorys

+0

Was nennst du SWIG_MODULE_elecswig_REAL_NAME? – Algorys