创建makefile链接源文件和库生成可执行文件

创建makefile文件

# 编译器和链接器  
CC = gcc  
  
# 包含目录
INC_DIRS = -I./ -I./Inc

# 源文件  
SRCS = network_main.c  network.c network_data.c network_data_params.c  
  
# 目标文件  
OBJS = $(SRCS:.c=.o)  
  
# 库文件  
LIBS = -L./Lib -lNetworkRuntime900_CM7_GCC  
  
# 最终的可执行文件  
TARGET = arc-detect-test  
  
# 默认目标  
all: $(TARGET)  
  
# 编译目标文件  
%.o: %.c
	$(CC) $(INC_DIRS) -c $< -o $@  
  
# 链接可执行文件  
$(TARGET): $(OBJS)  
	$(CC) $^ -o $@ $(LIBS)  
  
# 清理生成的文件  
clean:  
	rm -f $(OBJS) $(TARGET)

 注意事项:

  • 在 Makefile 中,命令前必须使用制表符(Tab),而不是空格。
  • 确保 -L.(库文件搜索路径)和 -lNetworkRuntime900_CM7_GCC(库文件名,不带前缀 lib 和后缀 .a.so)是正确的
  •  %.o: %.c 模式规则来编译每个 .c 文件到对应的 .o 文件。这样,Makefile 就会根据源文件的依赖关系智能地决定哪些文件需要重新编译。
  • $(CC) $(INC_DIRS) -c $< -o $@ 是一个命令,用于编译单个源文件。编译 $< 指定的源文件,并将编译生成的目标文件输出为 $@。例如,如果当前正在编译 network.o 这个目标文件,并且 network.c 是对应的源文件,这条命令会展开为:
gcc -I./Inc -c network.c -o network.o

报错信息:

/usr/bin/ld: skipping incompatible ./libNetworkRuntime900_CM7_GCC.a when searching for -lNetworkRuntime900_CM7_GCC

这个错误信息是在链接阶段发生的,意味着链接器(ld)在尝试链接你的程序时遇到了问题。

这表示链接器找到了名为 libNetworkRuntime900_CM7_GCC.a 的静态库文件,但是因为它与当前的目标系统不兼容(可能是架构不匹配,比如库是为32位系统编译的,而你的系统是64位的,或者库是为不同的处理器架构编译的),所以链接器决定跳过这个库。

如果你使用的是 Linux 系统,并且怀疑库文件可能不兼容,你还可以使用 readelf 命令(如果库包含 ELF 对象文件的话)来检查架构:

readelf -h *.a或*.o

在输出中,你应该能看到一个 Machine 字段,它会告诉你对象文件是为哪种处理器架构编译的,比如 x86_64ARM 等。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值