makefile 中c/c++混编编译遇到的问题

makefile 中c/c++混编编译遇到的问题

前提:三个文件server.c client.c wrapper.c,c风格编写的,server.c包含了c++11的内容。mac os下面编译。
其中server.c包含了c++11的内容,其他部分使用c风格的方式写的,为了以后扩展写了makefile编译,其中遇到了很多问题,花了很长时间来解决,记录如下:

  1. 编译命令是gcc/g++,有clang的warning报错
    clang: warning: treating ‘c’ input as ‘c++’ when in C++ mode, this behavior is deprecated [-Wdeprecated]

    一直以为gcc g++没安装等等路径等有问题,导致有问题,实际上因为现在的操作系统,gcc g++都是别名,真正连接的是clang,这个没问题
    可以使用gcc -v clang -v查看下
    在这里插入图片描述
    这个warning本身是因为c++程序用c编译,把.c改为.cpp即可解决

  2. g++的-std11的参数被忽略,导致程序编译不过
    g++ wrapper.cpp server.cpp -std=c++11 -o server 执行后server可以编译成功
    但如下makefile编译不过

```bash
CC = g++
CFLAGS = -std=c++11
source = wrapper.cpp server.cpp 
sourcec = client.cpp
objects = server.o wrapper.o
objectc = client.o
server:$(objects)
	$(CC)  -std=c++11 $(source) -o server -Wall -g 
编译的时候指令显示如下:(少了std=c++11,多了-c)
c++    -c -o server.o server.cpp
server.cpp:42:25: error: expected expression
        std::thread thr([count, &buf, cfd](){
```

问题出在依赖objects此处改为依赖为source即可解决
或者改成如下:
$(objects):$(source)
	$(CC) $(CFLAGS) -c  $(source) 

server:$(objects)
	$(CC)   $(objects) -o server -Wall -g 
让执行程序依赖.o,.cpp编译成.o

gcc的简单使用可以参考https://www.cnblogs.com/testlife007/p/6555404.html

附录是最终的makefile

CC = g++
CFLAGS = -std=c++11
source = wrapper.cpp server.cpp 
sourcec = client.cpp
objects = $(patsubst %.cpp, %.o, $(source))
objectc = $(patsubst %.cpp, %.o, $(sourcec))
headers = ./head
all:server cli

$(objects):$(source)
	$(CC) $(CFLAGS) -c  $(source) -I$(headers)

server:$(objects)
	$(CC)   $(objects) -o server -Wall -g 
	
cli:$(objectc)
	$(CC) $(CFLAGS) client.cpp -o cli -Wall -g

.PHONY:clean
clean:
	- rm server cli  server $(object)
	rm  -rf *.dSYM
	rm *.o