当前位置: 首页 > news >正文

程序运行的一些基础知识

  • 在交叉编译和运行程序时,不同阶段需要头文件和库文件的路径配置:
  • 指定头文件和库文件的路径
  • 编译器和编译选项
  • 目标文件
  • 编译规则
  • 编译每个源文件
  • 清理目标文件

运行以下命令可以查看arm-buildroot-linux-gnueabihf-gcc编译器的预处理器输出和详细信息:

echo 'main(){}' | arm-buildroot-linux-gnueabihf-gcc -E -v -

这个命令的作用如下:

echo ‘main(){}’:输出一个简单的C程序。
arm-buildroot-linux-gnueabihf-gcc:调用交叉编译器。
-E:只运行预处理器,不进行编译。
-v:显示详细的编译器信息。
-:从标准输入读取代码。
运行这个命令后,你将看到编译器的详细信息和预处理后的代码。

在交叉编译和运行程序时,不同阶段需要头文件和库文件的路径配置:

编译时头文件路径:

系统默认路径:通常在交叉编译工具链的 include 目录中。
自定义路径:可以使用 -I dir 选项指定自定义头文件目录。
链接时库文件路径:

系统默认路径:通常在交叉编译工具链的 lib 目录中。
自定义路径:可以使用 -L dir 选项指定自定义库文件目录。
运行时库文件路径:

系统默认路径:板子上的 /lib、/usr/lib 目录。
自定义路径:可以通过环境变量 LD_LIBRARY_PATH 指定额外的库文件路径。
注意:运行时不需要头文件,因此头文件无需放到板子上。

在 Makefile 中可以使用变量来指定头文件和库文件的路径,并通过 -I、-L 和 LD_LIBRARY_PATH 等选项在编译和链接时传递给编译器。以下是一个示例 Makefile,展示了如何指定头文件和库文件位置:

makefile
Copy code

指定头文件和库文件的路径

INCLUDE_DIRS = /path/to/include /another/path/to/include
LIB_DIRS = /path/to/lib /another/path/to/lib
LIBS = -lmylib -lanotherlib # 链接的库(省略 lib 前缀)

编译器和编译选项

CC = arm-linux-gcc # 交叉编译工具链中的编译器
CFLAGS = -Wall -g $(addprefix -I, $(INCLUDE_DIRS)) # 加入头文件路径
LDFLAGS = $(addprefix -L, $(LIB_DIRS)) $(LIBS) # 加入库文件路径和链接的库

目标文件

TARGET = myprogram
SRCS = main.c other.c # 源文件列表
OBJS = $(SRCS:.c=.o) # 对应的目标文件

编译规则

$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $@ $(LDFLAGS)

编译每个源文件

%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@

清理目标文件

clean:
rm -f $(OBJS) $(TARGET)
说明
头文件路径:INCLUDE_DIRS 变量指定了头文件所在目录,然后通过 $(addprefix -I, $(INCLUDE_DIRS)) 将这些目录转为 -I 参数并传递给 CFLAGS。

库文件路径:LIB_DIRS 变量指定库文件目录,通过 $(addprefix -L, $(LIB_DIRS)) 将这些目录转为 -L 参数,传递给 LDFLAGS。

链接的库:LIBS 变量指定链接的库名称,可以使用 -l 选项指定库名(省略库文件的前缀 lib 和扩展名 .so 或 .a)。

运行时库路径:如果在运行时需要特定的库文件路径,可以在运行程序前指定 LD_LIBRARY_PATH 环境变量,例如:

sh
Copy code
export LD_LIBRARY_PATH=/path/to/lib:/another/path/to/lib
./myprogram
运行示例
在终端中运行 make 命令进行编译,make clean 清理编译文件。


http://www.mrgr.cn/news/69876.html

相关文章:

  • 线性代数(第三章:向量)
  • 云原生周刊:Istio 1.24.0 正式发布
  • c# Encoding.GetEncoding
  • 【算力基础】GPU算力计算和其他相关基础(TFLOPS/TOPS/FP32/INT8...)
  • canal配置之一:admin配置
  • 如何开发直播实时美颜平台?美颜SDK开发详解
  • 16、liunx硬盘修复
  • 材质(三)——材质参数集和材质函数
  • [C++11] 类中新特性的添加
  • 第三十一篇——微分(下):搞懂“奇点”,理解“连续性”
  • 【Flume实操】实时监听 NetCat 端口和本地文件数据到 HDFS 案例分析
  • 第11课 string类型的应用
  • 工单系统在手,双重挑战无忧
  • 用 Python 从零开始创建神经网络(三):添加层级(Adding Layers)
  • 【图】图学习
  • 了解Hadoop:大数据处理的核心框架
  • JUC并发队列及应用
  • 计算机研究生方向,零基础入门到精通,收藏这篇就够了
  • halcon仿射变换核心技术分析
  • 2024年【危险化学品生产单位主要负责人】找解析及危险化学品生产单位主要负责人考试技巧
  • 910. 最小差值 II
  • 《Python网络安全项目实战》项目3 处理文件中的数据_练习题(2)
  • GB/T 43206—2023信息安全技术信息系统密码应用测评要求(二)
  • 闭包的知识
  • CMS那点事
  • 分布式唯一ID生成(二): leaf