V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cyshall
V2EX  ›  C++

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

  •  
  •   Cyshall · 2022-03-16 23:14:21 +08:00 · 1917 次点击
    这是一个创建于 1007 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 已经来回检查不知道多少遍了,快崩溃了,希望有老哥能指点一二,感激不尽。

    thedrwu
        1
    thedrwu  
       2022-03-16 23:21:37 +08:00 via Android
    apiClient.o: apiClient.c

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

    还是用 cmake 吧
    agagega
        2
    agagega  
       2022-03-16 23:25:37 +08:00
    用 make -p 看看
    thedrwu
        3
    thedrwu  
       2022-03-16 23:27:01 +08:00 via Android
    又看了一眼,还有许多槽点,建议上 cmake 。
    matrixji
        4
    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
        5
    Cyshall  
    OP
       2022-03-16 23:57:15 +08:00
    @matrixji 感谢回答,我刚尝试了一下错误依旧。
    Cyshall
        6
    Cyshall  
    OP
       2022-03-17 00:02:24 +08:00
    @thedrwu 公司之前的项目,不让上 cmake 。其次就是 `$(target): $(cobjs) $(objs)` 这一行如果改成`$(target): $(objs) $(cobjs)` 这样,也就是先编译 C++的代码没任何问题,就是轮到 C 的时候会报错。 老哥如果觉得哪里有问题还请多多指点一下🙏
    kilasuelika
        7
    kilasuelika  
       2022-03-17 08:03:51 +08:00 via Android
    是不是没有找到 apiClient.c 噢?
    godknowsme
        8
    godknowsme  
       2022-03-17 22:07:12 +08:00 via Android
    我猜可能是%.o 区分不了两种规则吧,可以试试换个后缀
    Cyshall
        9
    Cyshall  
    OP
       2022-03-22 11:54:42 +08:00
    @kilasuelika
    @matrixji
    @godknowsme
    @agagega
    第二天脑袋清醒后仔细检查了一遍还是路径问题,感谢各位的回答。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3390 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 11:07 · PVG 19:07 · LAX 03:07 · JFK 06:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.