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编译,其中遇到了很多问题,花了很长时间来解决,记录如下:
-
编译命令是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即可解决 -
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