关于 C 和 C++混合编译的 Makefile

2022-03-16 23:14:21 +08:00
 Cyshall

makefile 内容如下:

CC = gcc
CXX ?= g++
LVL ?= -g -O3
Opts += $(LVL)

VPATH=../k8s-c-client/kubernetes/config/ ../k8s-c-client/kubernetes/include/ ../k8s-c-client/kubernetes/api/ ../k8s-c-client/kubernetes/watch/ ../k8s-c-client/kubernetes/external


CFLAGS = -std=c++11 -Wall -w $(Opts)
INCFLAGS = -I../k8s-c-client/kubernetes/config/ -I../k8s-c-client/kubernetes/include -I../k8s-c-client/kubernetes/api -I../k8s-c-client/kubernetes/watch -I../k8s-c-client/kubernetes/external
LDFLAGS += $(LDLIBCPP) -rdynamic -lpthread


target = predixy

cobjs = apiClient.o kube_config.o CoreV1API.o watch_util.h cJSON.o

objs = \
	 Crc16.o \
	 HashFunc.o \
	 Timer.o \
	 Logger.o \
	 LogFileSink.o \
	 Alloc.o \
	 Socket.o \
	 ListenSocket.o \
	 AcceptSocket.o \
	 ConnectSocket.o \
	 $(multiplexor).o \
	 Subscribe.o \
	 Connection.o \
	 AcceptConnection.o \
	 ConnectConnection.o \
	 Buffer.o \
	 Command.o \
	 Distribution.o \
	 Enums.o \
	 Reply.o \
	 ConfParser.o \
	 Conf.o \
	 Auth.o \
	 DC.o \
	 LatencyMonitor.o \
	 RequestParser.o \
	 Request.o \
	 ResponseParser.o \
	 Response.o \
	 Server.o \
	 ServerGroup.o \
	 ServerPool.o \
	 ClusterNodesParser.o \
	 ClusterServerPool.o \
	 StandaloneServerPool.o \
	 ConnectConnectionPool.o \
	 Handler.o \
	 Proxy.o \
	 CGetEndpoint.o \
	 main.o

.PHONY : default debug clean

default: $(target)


$(target): $(cobjs) $(objs) 
	$(CXX) $(CFLAGS) -o $@ $^ $(LDFLAGS)

%.o : %.c
	$(CC) -c $^ -o $@ $(INCFLAGS)

%.o : %.cpp
	$(CXX) $(CFLAGS) -c $^ $(INCFLAGS)

debug:
	@make LVL=-g

clean:
	@rm -rf $(objs) $(target)
	@rm -rf $(cobjs)
	@echo Done.

报错:

make: *** No rule to make target `apiClient.o', needed by `predixy'.  Stop.

C++的代码一切正常,就是 C 的死活编译不过(报上面的错),makefile 已经来回检查不知道多少遍了,快崩溃了,希望有老哥能指点一二,感激不尽。

1870 次点击
所在节点    C++
9 条回复
thedrwu
2022-03-16 23:21:37 +08:00
apiClient.o: apiClient.c

还有个 issue:如果写了 $^ 不方便带上依赖的.h (至少不是每个编译器都能忽略.h),可以考虑 $<

还是用 cmake 吧
agagega
2022-03-16 23:25:37 +08:00
用 make -p 看看
thedrwu
2022-03-16 23:27:01 +08:00
又看了一眼,还有许多槽点,建议上 cmake 。
matrixji
2022-03-16 23:33:39 +08:00
规则覆盖了。这样修改:

```
cobjs = apiClient.o kube_config.o CoreV1API.o watch_util.h cJSON.o
```

=>

```
cobjs = c/apiClient.o c/kube_config.o c/CoreV1API.o c/cJSON.o
```

```
%.o : %.c
$(CC) -c $^ -o $@ $(INCFLAGS)
```

=>

```
c/%.o : %.c
$(CC) -c $^ -o $@ $(INCFLAGS)
```
Cyshall
2022-03-16 23:57:15 +08:00
@matrixji 感谢回答,我刚尝试了一下错误依旧。
Cyshall
2022-03-17 00:02:24 +08:00
@thedrwu 公司之前的项目,不让上 cmake 。其次就是 `$(target): $(cobjs) $(objs)` 这一行如果改成`$(target): $(objs) $(cobjs)` 这样,也就是先编译 C++的代码没任何问题,就是轮到 C 的时候会报错。 老哥如果觉得哪里有问题还请多多指点一下🙏
kilasuelika
2022-03-17 08:03:51 +08:00
是不是没有找到 apiClient.c 噢?
godknowsme
2022-03-17 22:07:12 +08:00
我猜可能是%.o 区分不了两种规则吧,可以试试换个后缀
Cyshall
2022-03-22 11:54:42 +08:00
@kilasuelika
@matrixji
@godknowsme
@agagega
第二天脑袋清醒后仔细检查了一遍还是路径问题,感谢各位的回答。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/840893

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX