2013-05-05 59 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或通過編譯器開關強制執行)。