自学内容网 自学内容网

程序运行的一些基础知识

运行以下命令可以查看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 清理编译文件。


原文地址:https://blog.csdn.net/weixin_50993868/article/details/143661751

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!