1.12

工作中解决的问题(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++在函数中的作用

总结:所有的工作中的问题一项一项的都被解决了。做事情不要着急,你不会,就是因为你缺少基本的知识,先静下心来,填补一些知识,搜集一些有用的材料,时间总会给出答案。记住要坚持。

上一篇:Annotation 使用备忘2


下一篇:PKG_COLLECTION_LHR 存储过程或函数返回集合类型