C++ 编译链接

main.c

预编译  main.i

      删除注释

      头文件引入

      宏展开

编译  main.s

      代码优化

       汇总所有的符号

汇编  main.o  二进制可重定位文件

     根据特定平台 将汇编指令转换成机器码

      构建 .o(obj) 文件

链接  可执行文件

      1 合并所有obj文件的段,并调整段偏移和段长度,合并符号表

      2 链接二点核心:符号重定位  注意强弱符号

         符号处理只对所有obj文件的global符号进行处理

        local 的符号不做处理  static 修饰的就是local

        符号解析完成后 就分配内存地址(虚拟地址)

        符号解析就是所有obj符号表中对符号引用的地方都要找到该符号定义的地方

     3 所有相同属性的段进行合并组织在一个页面,调整段偏移和长度

        然后符合并号表,

        然后给符号分配内存地址  

                         函数符号地址存的是偏移量,因为函数调用要跳到别的代码段。

                         函数符号的真实地址是,下一行指令 + 偏移量

         然后给符号重定位 

objdump -h main.o   打印obj文件的段

readelf -h main.o  打印 elf  文件头

信息: 平台  体系  入口地址  文件头大小 52 字节

bss 段不占elf文件的空间,占虚拟内存的空间

bss段的初始都为0  不需要存储,存储是为了记录初始值

每个段都会记录在段表中

file main.o  查看文件属性

readelf -S main.o  查看所有段

.text    AX 可读可执行

.data  WA 可读可写

.bss   WA 可读可写

.comment

.note.GNU-stack

.shstrtab

.symtab   符号表段

.strtab

objdump -d main.o  查看机器码 和汇编

objdump -s main.o 打印段的内容

char *p = "hello world"; 常量字符串在 .rodata (只读数据段)

C语言种有强符号和弱符号的概念  初始化的是强符号 未初始化的是弱符号

C语言:多个强符号 编译出错

              强符号和弱符号 选强符号

               多个弱符号选 占用内存最大的弱符号

objdump -t main.o  查看符号所在的段

A.c  文件要引用 B.c 文件中的变量, 需要在A.c 或A.h 中 extern int data;

汇编中 数据的地方地址都是 00 00 00 00 

            函数的地方都是 fc  ff  ff  ff 

           pc 寄存器保持下一条执行的指令  

程序的运行

1 创建虚拟地址空间到物理内存的映射(创建内核地址映射结构体)创建页目录和页表

2 加载代码段和数据段

3 把可执行文件的入口地址写到CPU的pc寄存器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
编译链接 C++ OpenCV 项目通常有两种方式,一种是使用 CMakeLists.txt 文件进行编译,另一种是使用 makefile 文件进行编译。 使用 CMake 进行编译链接的步骤如下: 1. 在项目根目录下创建一个 CMakeLists.txt 文件,并添加必要的配置: ``` cmake_minimum_required(VERSION 3.12) project(your_project_name) set(CMAKE_CXX_STANDARD 11) # 设置 OpenCV 路径 set(OpenCV_DIR /path/to/opencv) # 寻找 OpenCV 库 find_package(OpenCV REQUIRED) # 添加头文件路径 include_directories(${OpenCV_INCLUDE_DIRS}) # 添加源文件 add_executable(your_executable_name main.cpp) # 链接 OpenCV 库 target_link_libraries(your_executable_name ${OpenCV_LIBS}) ``` 2. 在项目的 source 目录下创建一个 CMakeLists.txt 文件,并添加需要编译的源文件: ``` add_library(your_library_name SHARED your_source_files.cpp) ``` 3. 创建一个 build 目录,在终端中进入该目录: ``` mkdir build cd build ``` 4. 运行 CMake 生成 Makefile: ``` cmake .. ``` 5. 使用 make 命令进行编译链接: ``` make ``` 6. 最终会在 build/source/lib 目录下生成一个 libyour_library_name.so 的动态库,这就是可供他人调用的动态库。 使用 makefile 进行编译链接的步骤如下: 1. 在项目根目录下创建一个 makefile 文件,并添加必要的配置: ``` CXX = g++ CXXFLAGS = -Wall -std=c++11 LDFLAGS = -L/path/to/opencv/libs LDLIBS = -lopencv_core -lopencv_imgproc -lopencv_highgui your_executable_name: main.o $(CXX) $(LDFLAGS) -o $@ $^ $(LDLIBS) main.o: main.cpp $(CXX) $(CXXFLAGS) -c -o $@ $^ ``` 2. 在项目的 include 目录下放置项目的头文件。 3. 在项目的 source 目录下放置项目的源文件。 4. 在终端中进入项目根目录,并运行命令 make。 5. 最终会在项目根目录生成一个名为 your_executable_name 的可执行文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从一而终

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值