C++编译与链接(1)-编译与链接过程

依旧开篇感谢原作者,再次膜拜~

大家知道计算机使用的一系列的1和0。那个一个C++语言程序又是如何从一个个.h和.cpp文件变成包含1和0的可执行文件呢?
可以认为有以下的几个环节:
源程序->预处理->编译和优化->生成目标文件->链接->可执行文件

1.预处理

  C++的预处理是指在C++程序源代码被编译之前,由预处理器对C++程序源代码进行的处理。这个过程并不对程序的源代码进行解析。这里的预处理器(preprocessor)是指真正的编译开始之前由编译器调用的一个独立程序。

预处理器主要负责以下的几处:
1.宏的替换
2.删除注释
3.处理预处理指令,如#include,#ifdef

如我们有以下代码:
temp.h

#ifndef   _HEADERNAME_H
#define  _HEADERNAME_H  1
#include <iostream>
inline void show(char *a)
{
    std::cout << a<< std::endl;//annotation
}
#endif

main.cpp

#include "temp.h"
#define MACRO "This is a macro"
extern int i;
int main()
{
        std::cout<<i<<std::endl;
        show(MACRO);
}

a.cpp

#include <iostream>
int i=100;

*在vs2013中可以使用“VS2013 开发人员命令提示”
在这里插入图片描述
使用cl /P main.cpp只进行预编译生成main.i文件
*g++中可以使用(在以下只使用g++进行演示)
g++ –E main.cpp>main.i命令
g++ –E a.cpp>main.i
打开生成的A.i文件
我们发现

1、show函数中的注释已经被删掉了
在这里插入图片描述
2、main函数中的MACRO宏被替成了"this is a macro”
windows vs下
在这里插入图片描述
3、temp.h和main.cpp中的#include 和#include “temp.h”也在相应位置被展开了
在这里插入图片描述
2.编译和优化
在这里插入图片描述
词法分析 – 识别单词,确认词类;比如int i;知道int是一个类型,i是一个关键字以及判断i的名字是否合法。
语法分析 – 识别短语和句型的语法属性;
语义分析 – 确认单词、短语和句型的语义特征;
代码优化 – 修辞、文本编辑;
代码生成 – 生成译文。
内联函数的替换就发生在这一阶段
在g++中可以使用
g++ -S将预处理阶段生成的.i文件生成相应的汇编文件
g++ –S main.i main.s
g++ –S a.i a.s
生成的部分代码如下:
在这里插入图片描述
3.生成目标文件
  汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。
在最终的目标文件中,除了拥有自己的数据和二进制代码之外,还要至少提供2个表:未解决符号表和导出符号表,分别告诉链接器自己需要什么和能够提供什么。
  编译器把一个cpp编译为目标文件的时候,除了要在目标文件里写入cpp里包含的数据和代码,还要至少提供3个表:未解决符号表,导出符号表和地址重定向表。未解决符号表提供了所有在该编译单元里引用但是定义并不在本编译单元里的符号及其出现的地址。导出符号表提供了本编译单元具有定义,并且愿意提供给其他编译单元使用的符号及其地址。
  地址重定向表提供了本编译单元所有对自身地址的引用的记录。
g++中可以使用g++ -c命令

g++ –c main.s –o main.o
g++ –c a.s –o a.o

4.链接
  由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。

g++ a.o main.o –o main.exe

最终运行结果如下

100
This is a macro
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
编译链接 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 的可执行文件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值