.i .s .o .out(.exe) .a(.lib) .so(.dll)

从源代码到可执行文件

源代码.c/cpp------>可执行文件.out/exe

预处理生成.i
汇编文件.s
生成二进制.o
链接成可执行文件.out/exe  // 多个.o目标文件链接后生成可执行文件

在这里插入图片描述

g++ –E main.cpp        // 生成.i
g++ –S main.i main.s   // 由.i生成.s
g++  -C  main.cpp      // 生成.o二进制目标文件                    .cpp--->.o
g++  main.o  -o  AA    // 由.o目标文件到可执行文件AA.out/exe      .o--->.out/exe
g++  main.cpp          // 编译连接一起,生成可执行文件a.out/exe    .cpp-->.out/exe
g++  main.cpp -o AA    // 由.cpp源文件到可执行文件AA.out/exe

.a/lib(静态库)
.a/lib文件是将.o文件打包生成的静态库。
.a(libxxx.a)静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。
文件实质上就是.o文件打了个包,一般把它叫做静态库文件,它在使用的时候,效果和使用.o文件是一样的。

.so/dll(动态库)
.so/dll文件是动态库,当程序运行的时候才加载进来。
.so(libxxx.so)动态库文件名的命名规范是以lib为前缀,紧接着跟动态库名,扩展名为.so。

编译选项-I 是查找头文件、-D宏定义

编译选项 -E -S -C
输出文件 -i -s -o(预处理文件、汇编文件、目标文件)

生成预处理文件

gcc  -E ./main.c -I ./include -o man.i  //生成预处理文件,-I指定头文件路径

.a 和 .so的特点

在这里插入图片描述

找到自己的动态库 Linux中

xxx.so.1 1通常表示版本,需要不同版本时可以把.so软链接到对应版本的.so即可。
编译成.o时 注意需要编译成位置无关码,
三种方式,

  1. 直接将.so拷贝到系统lib里 (不建议)
  2. 在环境变量中添加
  3. 将路径添加到系统动态库的配置文件
    在这里插入图片描述

对于.so的链接方法 启动时链接 和 显式运行时链接(运行时加载)

运行时加载的优点:运行时加载使得程序的模块组织更加灵活,可以实现诸如插件、驱动等功能,实现了使用时才加载、使用完即卸载。

  • 不必从程序一开始就将其全部装载进来,减少了程序启动时间和内存使用
  • 程序不必重启就可以实现模块的增加、删除、更新等

对于服务器端的应用程序来说,显式运行时链接可以在程序不重启的情况下加载更新后的动态库,这对于7*24小时工作的服务器来说是至关重要的。

可以通过使用`ctypes`库来实现Python调用C++代码的功能。具体来说,您需要编写C++函数并将其编译为共享库(.so或.dll文件),然后使用`ctypes`库在Python中加载该库并调用该函数。 以下是一个简单的示例,演示如何使用`ctypes`库从Python中调用C++函数,该函数使用OpenCV库并返回一个`np.array`类型的图像: C++代码(mylib.cpp): ```c++ #include <opencv2/opencv.hpp> extern "C" { void process_image(unsigned char* data, int width, int height, int channels, unsigned char* output) { cv::Mat img(height, width, CV_MAKETYPE(CV_8U, channels), data); cv::Mat out_img; cv::cvtColor(img, out_img, cv::COLOR_BGR2GRAY); out_img.copyTo(cv::Mat(height, width, CV_MAKETYPE(CV_8U, 1), output)); } } ``` Python代码: ```python import ctypes import numpy as np import cv2 # Load shared library lib = ctypes.cdll.LoadLibrary('./mylib.so') # Define function arguments and return type lib.process_image.argtypes = [ctypes.POINTER(ctypes.c_ubyte), ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_ubyte)] lib.process_image.restype = None # Load input image img = cv2.imread('input.png') data = np.frombuffer(img.tobytes(), dtype=np.uint8) width, height, channels = img.shape # Allocate output buffer out_data = np.zeros((height, width), dtype=np.uint8) # Call C++ function lib.process_image(data.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte)), width, height, channels, out_data.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte))) # Convert output buffer to np.array out_img = np.frombuffer(out_data.tobytes(), dtype=np.uint8).reshape((height, width)) # Display output image cv2.imshow('Output', out_img) cv2.waitKey(0) ``` 在这个示例中,我们使用`ctypes`库加载了名为`mylib.so`的共享库,并定义了一个名为`process_image`的函数,该函数使用OpenCV库将输入图像转换为灰度图像,并将结果保存到输出缓冲区中。然后,我们从Python中加载输入图像,并为输出图像分配一个缓冲区。最后,我们调用C++函数,并将输入和输出数据指针传递给该函数。最后,我们将输出缓冲区转换为`np.array`类型,并在OpenCV窗口中显示结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值