2013-05-05 60 views
0

我有一个c项目,我一直在使用以下Makefile建设。如何使用Make构建与某些C++代码混合的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/ 

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.cppmaxflow.cpptest.cpp)和头文件(graph.hblock.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) 

任何想法,如何去了解呢?

+0

你会错误地告诉我们确切的错误是什么。猜测,你在某些函数声明中忘了'extern“C”'。 – 2013-05-05 19:40:13

+3

用'g ++'链接你的程序,即'$(CXX)' – 2013-05-05 19:40:26

+0

在“MSKLINKFLAGS = ..”行中也有一个杂散的反斜线。 – 2013-05-05 19:41:39

回答

1

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或通过编译器开关强制执行)。