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.cppmaxflow.cpptest.cpp) とヘッダー ファイル ( graph.hblock.h) で構成されます。独立して、次を使用して c++ プロジェクトをコンパイルでき、正常に動作するようです。

g++ test.cpp graph.cpp maxflow.cpp

main()次に、のコードを元のプロジェクトに移動する必要がtest.cppありapi.cますcapi.cしたがって、を使用してコンパイルする必要がありますg++

次のことを試しましたが、うまくいかないようです:

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 のファイルは、g++ が使用されていても C コードとしてコンパイルされます。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 に答える