如何使用Make构建与某些c ++代码混合的c项目?

时间:2013-05-05 19:38:51

标签: c++ c build makefile

我有一个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.cppmaxflow.cpptest.cpp)和头文件(graph.h,{ {1}})。独立我可以使用以下代码编译c ++项目,它似乎工作正常。

block.h

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

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

g++

任何想法,如何解决这个问题?

1 个答案:

答案 0 :(得分: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或由编译器开关强制执行)。