zoukankan      html  css  js  c++  java
  • 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++在函数中的作用

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

  • 相关阅读:
    Java并发编程
    Git
    Spring Boot
    IDEA工具
    Java基础
    数据库架构
    设计模式
    网络基础
    管理知识
    linux安装数据库mysql
  • 原文地址:https://www.cnblogs.com/bookdrip/p/10259460.html
Copyright © 2011-2022 走看看