工作中解决的问题(g++的程序编译,makefile的编辑,以及python调用c++的动态库的内容)
vim的一些操作指南
- :set number:显示行号
- :split:分屏
- :open [file]:打开一个新的文件(创建)
- :e[file]:打开另外一个文件
- ctrl+w+箭头:分屏的选择操作
- dw:从当前光标位置开始删除,直到删除到单词的最后
- daw:直接删去当前光标所在的单词
g++程序的编译
opencv编译的过程中,需要配置opencv自带的库文件和头文件,需要使用pkg-config
$g++ -o test tes.cpp `pkg-config --libs --cflags opencv`
#含义是编译test.cpp为可执行文件 后面 ` `这个符号是指运行bash命令的参数,寻找文件名为opencv的pkg-config,使用其中的 libs(链接库)和cflags(头文件)
opencv程序中makefile模板的编写
#wolfrecg's makefile
INCLUDE = $(shell pkg-config --cflags opencv)
LIBS = $(shell pkg-config --libs opencv)
OBJECTS = imgfeatures.o kdtree.o minpq.o sift.o utils.o xform.o wolf_recg.o dspfeat.o
SOURCE = imgfeatures.c kdtree.c minpq.c sift.c utils.c xform.c wolf_recg.cpp dspfeat.cpp
BIN = libbin.so
$(OBJECTS) : $(SOURCE)
g++ -g -c $(SOURCE) `pkg-config --cflags opencv`
$(BIN):$(OBJECTS)
g++ -shared -fPIC -o $(BIN) $(OBJECTS) `pkg-config --libs --cflags opencv`
clean:
rm $(OBJECTS) $(BIN)
使用方式
#libbin.so是你需要生成终极目标($(BIN))
$ sudo make libbin.so
linux下g++的编译问题
- g++不再支持隐式的指针类型转换,需要显式的强制类型转换
- .h与.cpp文件的不同作用
- .h文件主要是进行一些变量的定义和函数的声明(通过extern来进行定义)
- .cpp需要加载程序实现的头文件和函数的定义
g++生成动态链接库
$g++ -shared -fPIC -o test.so test.o
#test.o可以跟上所有需要用的.o文件
python调用动态链接库
python调用c动态链接库模板
import ctypes
from ctypes import *
#加载文件
ll = ctypes.cdll.LoadLibrary
lib = ll(./test.so)
#call
fun=lib.test ##类似c/c++函数指针
fun.restype = c_int ##设置函数返回值类型
fun()#运行此函数
这是一个c的调用模板,可是c++的编译器和c存在了一些不同,因为c++支持了函数重载,所以编译后的函数名和原来的函数名存在了一些差异。可以通过.o目标文件来查看函数名的样式再进行调用
$objdump -t main.o |grep find_wolf
#可以发现find_wolf被封装成了_Z9find_wolfV直接使用这个函数名,可以成功在python中运行。
g++对一个工程的调试
在最终生成的目标文件的shell中添加 -g选项署名生成可调式的可执行文件
通过命令 s(step)来进入函数的内部
存在的一些问题
- makefile的基本依赖规则还是没有理清楚:以下问题
- 总是出现未定义,或者重复定义的内容
- 文件的生成与依赖的关系
- 默认的makefile规则和默认的include的依赖关系
*makefile中的变量的使用
- g++中为何产生不一样的函数名的理解,和extern ,extern c extern c++在函数中的作用
总结:所有的工作中的问题一项一项的都被解决了。做事情不要着急,你不会,就是因为你缺少基本的知识,先静下心来,填补一些知识,搜集一些有用的材料,时间总会给出答案。记住要坚持。