Liaison multilingue C / C ++ facile avec CMake + SWIG

CMake et SWIG sont maintenant assez célèbres, mais vous pouvez facilement générer du code glue C / C ++ en combinant ces deux éléments.

Désolé pour le contenu minable pour conclure le calendrier de l'Avent 2013 ...

Utiliser le code C ++ de Python

Structure du répertoire

Programme d'essai

CMakeList.txt


find_package(PythonLibs REQUIRED)
find_package(SWIG REQUIRED)
include(${SWIG_USE_FILE})
include(GenerateExportHeader)

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${PROJECT_BINARY_DIR}
    ${PYTHON_INCLUDE_PATH}
)

set(EXAM_SRCS
    example.h
)

set(INTERFACE_FILES
    example.i
)

set_source_files_properties(${INTERFACE_FILES} PROPERTIES CPLUSPLUS   ON)
swig_add_module(example python ${INTERFACE_FILES}
    ${EXAM_SRCS}
)

swig_link_libraries(example
    ${PYTHON_LIBRARIES}
)

example.h


#pragma once
#include <string>
class ExampleClass{
    std::string m_msg;
public:
    ExampleClass() : m_msg("Hello World") { }
    const std::string& get_msg(){ return m_msg; }
    void set_msg(const std::string &msg){ m_msg = msg; }
};

example.i


%module example
%include "std_string.i"

%{
#define SWIG_FILE_WITH_INIT
%}
%{
#include "example.h"
%}

%include "example.h"

Construire

$cd build && cmake .. && make

Courir

$python
>>> import example
>>> e = example.ExampleClass()
>>> e.get_msg()
'Hello World'
>>> e.set_msg("FizzBuzz")
>>> e.get_msg()
'FizzBuzz'

Dans d'autres langues

Vous pouvez l'utiliser en spécifiant une autre langue dans CMakeLists.txt.

Recommended Posts

Liaison multilingue C / C ++ facile avec CMake + SWIG
Construction facile de code C ++ avec CMake sur Docker
Easy Grad-CAM avec pytorch-gradcam
En forme de conteneur réalisé avec C # 1
Débogage C / C ++ avec gdb
Débogage facile avec ipdb
TopView facile avec OpenCV
Incorporer un interpréteur Python dans une application C ++ avec pybind11 + cmake