linux makefile初步接触

记录一下目前自己写的两个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/ 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值