Python调用C++代码

有时候在工作中可能会遇到python调用c++源码的需要,最近就遇到了这种需求,对使用方法做一下记录。
仿照darknet中的做法

一、首先编写c++的源码,如下:
.h文件

#ifndef _H264DECODER_H
#define _H264DECODER_H

...
// Opencv
#include 
...

//FFmpeg
extern "C" {
#include "libavcodec/avcodec.h"
...
};

class H264Decoder {
public :
    H264Decoder();
    ~H264Decoder(); 
    void init();
private:
...
};
#endif 

.cpp文件

#include "H264Decoder.h"

H264Decoder::H264Decoder() {
    init();
}
void H264Decoder::init() {
    printf("in H264Decoder's init function!\n");
}
...
//以下是重点,不然不会导出c++的类。
extern "C" 
{
	H264Decoder obj;	 
	void init() 
	{
		return obj.init();	
	}
}

二、编写Makefile文件

SLIB=libh264decoder.so
OBJDIR=./

CC=g++
LDFLAGS= -lm -pthread -std=c++11
COMMON= -Iinclude/ -Isrc/
CFLAGS= -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC

COMMON+= -I/usr/local/ffmpeg_build/ffmpeg/include -I/opt/ros/kinetic/include/opencv-3.3.1-dev 
LDFLAGS+= -L/usr/local/ffmpeg_build/x264/lib -L/usr/local/ffmpeg_build/ffmpeg/lib  \
                   -lx264 \
                   -lavcodec \
                   -lavdevice \
                   -lavfilter \
                   -lavformat \
                   -lavutil \
                   -lswscale \
                   -lswresample \
                   -lpostproc \
           -L/opt/ros/kinetic/lib/x86_64-linux-gnu \
                   -lopencv_core3 \
                   -lopencv_highgui3 \
                   -lopencv_imgproc3 \
                   -lopencv_imgcodecs3 
OBJ= H264Decoder.o
EXECOBJA=H264Decoder.o

EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA))
OBJS = $(addprefix $(OBJDIR), $(OBJ))
DEPS = Makefile 

all: $(SLIB)

$(SLIB): $(OBJS)
	$(CC) $(CFLAGS) -shared $^ -o $@ $(LDFLAGS) -std=c++11

$(OBJDIR)%.o: %.cpp $(DEPS)
	$(CC) -std=c++11 $(COMMON) $(CFLAGS) -c $< -o $@ 

.PHONY: clean

clean:
	rm -rf $(OBJS) $(SLIB) $(EXECOBJ) 

三、编写python文件调用

from ctypes import *
import numpy as np
import math
import random
import cv2
import time
import ctypes

lib = CDLL("/home/muyangren/projectdir/develop/decoder_h264_node/libh264decoder.so", RTLD_GLOBAL)

if __name__ == "__main__":
   lib.init()

四、运行结果
Python调用C++代码_第1张图片

你可能感兴趣的:(python编程)