记录一下目前自己写的两个makefile文件。
1. 整个工程只有一个.c文件,调用arm gcc编译器生成可执行文件。可执行文件叫做hello。如果hello.c调用了其他.c文件的话,则在OBJ那里添加。将hello.o放在最下面。
CC=arm-linux-gnueabihf-gcc-4.9.1
CFLAGS=-I.
OBJ = hello.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hello: $(OBJ)
$(CC) -o $@ $^ $(CFLAGS)
clean:
-rm -f hello *.o
2. 整个工程只有一个read.c,但是需要调用一个外部的动态链接库文件。其makefile如下:
CC=arm-linux-gnueabihf-gcc-4.9.1
CFLAGS=-I.
TARGET=libmodbus.so.5
OBJ = read.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
read: $(OBJ)
$(CC) -o $@ $^ $(TARGET) $(CFLAGS)
clean:
-rm -f read *.o
如果项目文件变多,一般就会在工程目录下建立文件存放的子目录。举个例子,我要做一个json的工程。我现在要增加一个json的库,会有库文件以及相应的头文件。我决定在在工程目录下创建Library目录,并且在library目录下创建json目录,在json目录下创建inc目录。将json的库文件放在json文件夹。将json用到的头文件放到inc文件夹下。因此makefile文件就会变成:
CC=arm-linux-gnueabihf-gcc-4.9.1
CFLAGS=-I./library/json/inc
TARGET=./library/json/libjson-c.so.2
OBJ = json.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
json: $(OBJ)
$(CC) -o $@ $^ $(TARGET) $(CFLAGS)
clean:
-rm -f json *.o
在接下来的工作中,我发现,要把可执行文件传输给嵌入式设备,目前比较方便的方式是tftp,每次需要将编译完成的可执行文件人工copy到ttftboot文件夹(tftp server默认文件夹),确实感觉会很烦。因此在makefile内加入了cp命令,每次编译完成后,执行copy动作。
另外,由于需要操作线程,因此在链接指令中加入了-lpthread参数。
CC=arm-linux-gnueabihf-gcc-4.9.1
CFLAGS=-I./library/json/inc\
-I./library/libmodbus/inc\
TARGET=./library/json/libjson-c.so.2\
./library/libmodbus/libmodbus.so.5
OBJ = Rescource.o\
DeviceScan.o\
main.o
%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
main: $(OBJ)
$(CC) -o $@ $^ $(TARGET) $(CFLAGS) -lpthread
cp main /tftpboot/
clean:
-rm -f main *.o
这里添加一个题外话,既然上面将可执行文件拷贝到了tftpboot,那么嵌入式端,就需要通过调试命令的形式去获取这份文件。我这里一般使用SecureCRT。目前是我录制了一段脚本,并且将脚本拖拉到了了主界面上,这样整体编译下载调试的速度就快了许多。如下图所示:
到此为止,我个人认为开发相关的调试以及工具的配置应该也就差不多了。
还是太年轻了(too young, to Naive),客户要求我的库必须是以动态链接库的形式给他,所以我写的所有文件,必须先编译成.so,再由main函数进行调用。因此makefile还要改。因此需要先将源文件编译,再链接成.so,再编译成可执行文件做测试。
CC=arm-linux-gnueabihf-gcc-4.9.1
CFLAGS=-I./library/json/inc\
-I./library/libmodbus/inc\
TARGET=./library/json/libjson-c.so.2\
./library/libmodbus/libmodbus.so.5\
OBJECTS= Ch0process.o\
DeviceScan.o\
DeviceSniffer.o\
Publicfunc.o\
LocationTest.o\
adModbus_def.o\
adModbus.o
SOURCES = Ch0process.c\
DeviceScan.c\
DeviceSniffer.c\
Publicfunc.c\
LocationTest.c\
adModbus_def.c\
adModbus.c
default:
$(CC) -fPIC -c $(CFLAGS) $(SOURCES)
$(CC) -shared $(OBJECTS) -o libad485modbus.so $(CFLAGS) -lpthread
$(CC) -o main main.c -ldl -L/mnt/hgfs/WIN_D/Modbus485So/ -lad485modbus $(CFLAGS) $(TARGET) -lpthread
cp main /tftpboot/
clean:
-rm -f libad485modbus.so *.o
在期间,编译一直提示-lad485modbus,找不到libad485modbus.so。。 于是指定了一下.so的存放地址,搞定了。
-L/mnt/hgfs/WIN_D/Modbus485So/