程序运行的一些基础知识
- 在交叉编译和运行程序时,不同阶段需要头文件和库文件的路径配置:
- 指定头文件和库文件的路径
- 编译器和编译选项
- 目标文件
- 编译规则
- 编译每个源文件
- 清理目标文件
运行以下命令可以查看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 清理编译文件。