创建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_64
、ARM
等。