我有一个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
,{ {1}})。独立我可以使用以下代码编译c ++项目,它似乎工作正常。
block.h
现在我需要将g++ test.cpp graph.cpp maxflow.cpp
main()
中的代码移动到原始test.cpp
项目的api.c
中。因此,我需要使用c
编译api.c
。
我尝试了以下但它似乎不起作用:
g++
任何想法,如何解决这个问题?
答案 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或由编译器开关强制执行)。