如何使用Make构建混合了一些c++代码的c项目

How to build c project mixed with some c++ code using Make?

本文关键字:代码 c++ 项目 Make 何使用 构建 混合      更新时间:2023-10-16

我有一个c项目,我一直在使用以下Makefile构建。

CC=gcc
CFLAGS= -g
LIBS= -lm
MOSEK_H= /home//work/mosek/6/tools/platform/linux32x86/h/
MSKLINKFLAGS= -lmoseknoomp -lpthread -lm
MSKLIBPATH= /home/work/mosek/6/tools/platform/linux32x86/bin/
all: learn
clean: tidy
    rm -f learn
tidy:
    rm -f *.o
learn: spl.o api.o mosek_qp_optimize.o
    $(CC) $(CCFLAGS) spl.o api.o -o learn 
                     $(LIBS) -L $(MSKLIBPATH) $(MSKLINKFLAGS)
spl.o: spl.c
    $(CC) -std=c99 -c $(CFLAGS) spl.c -o spl.o
mosek_qp_optimize.o: mosek_qp_optimize.c
    $(CC) -c $(CFLAGS) mosek_qp_optimize.c -o mosek_qp_optimize.o -I $(MOSEK_H)
api.o: api.c api_types.h
    $(CC) -c $(CFLAGS) api.c -o api.o

我需要使用的第三方c++代码包括.cpp文件(graph.cpp, maxflow.cpp, test.cpp)和头文件(graph.h, block.h)。我可以独立编译c++项目使用以下,它似乎工作得很好。

g++ test.cpp graph.cpp maxflow.cpp

现在我需要将test.cppmain()中的代码移动到原c项目的api.c中。因此,我需要使用g++来编译api.c

我尝试了以下操作,但似乎不起作用:

CC=gcc
CFLAGS= -g
LIBS= -lm
MOSEK_H= /home//work/mosek/6/tools/platform/linux32x86/h/
MSKLINKFLAGS= -lmoseknoomp -lpthread -lm
MSKLIBPATH= /home/work/mosek/6/tools/platform/linux32x86/bin/
MAXFLOW_H= /home/work/maxflow/
all: learn
clean: tidy
    rm -f learn
tidy:
    rm -f *.o
learn: spl.o api.o mosek_qp_optimize.o graph.o maxflow.o
    $(CC) $(CCFLAGS) spl.o api.o mosek_qp_optimize.o graph.o maxflow.o -o learn 
                     $(LIBS) -L $(MSKLIBPATH) $(MSKLINKFLAGS)
spl.o: spl.c
    $(CC) -c $(CFLAGS) spl.c -o spl.o
mosek_qp_optimize.o: mosek_qp_optimize.c
    $(CC) -c $(CFLAGS) mosek_qp_optimize.c -o mosek_qp_optimize.o -I $(MOSEK_H)
api.o: api.cpp api_types.h
    $(CC) -c $(CFLAGS) api.cpp -o api.o -I $(MAXFLOW_H)
graph.o: graph.cpp
    $(CC) -c $(CFLAGS) graph.cpp -o graph.o -I $(MAXFLOW_H) 
maxflow.o: maxflow.cpp
    $(CC) -c $(CFLAGS) maxflow.cpp -o maxflow.o -I $(MAXFLOW_H) 

有什么主意吗,怎么做?

g++和GCC的区别仅在于链接的默认库;g++将链接stdlibc++以及libc和libm。否则它们是同一个编译器;它们都支持C和c++编译。默认情况下,任何扩展名为. C的文件都将被编译为C代码,即使使用了g++——它不会因为使用了g++而获得c++链接。

你的断言:

现在我需要将test.cpp的main()中的代码移动到原始c项目的api.c中。因此,我需要使用g++编译api.c。

不跟随;api.c将由C编译器编译,它包含的任何c++代码或引用带有c++链接的代码都将失败。从C代码调用的c++编译代码必须具有C链接。如果api.c包含c++代码,则必须将其编译为c++代码(将其重命名为api.cpp或通过编译器开关强制)。