0

我有一个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

现在我需要将代码移动到main()原始项目中。因此,我需要使用.test.cppapi.ccapi.cg++

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

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) 

任何想法,如何去做?

4

1 回答 1

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

于 2013-05-05T20:26:26.433 回答