gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:37:49 24 4
gpt4 key购买 nike

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

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

现在我需要将 test.cppmain() 中的代码移动到原始 api.c 中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)

任何想法,如何去做?

最佳答案

g++ 和 gcc 的区别仅在于所链接的默认库; g++ 将链接 stdlibc++ 以及 libc 和 libm。否则它们是同一个编译器;它们都支持 C 和 C++ 编译。默认情况下,任何具有 .c 扩展名的文件都将被编译为 C 代码,即使使用了 g++ - 它不会因使用 g++ 而获得 C++ 链接。

你的断言:

Now I need to move the code in the main() of test.cpp into api.c of the original c project. Therefore, I need to compile api.c using g++.

不遵循; api.c 将由 C 编译器编译,它包含的任何 C++ 代码或对具有 C++ 链接的代码的引用都将失败。从 C 代码调用的 C++ 编译代码必须具有 C 链接。如果 api.c 包含 C++ 代码,则必须将其编译为 C++ 代码(将其重命名为 api.cpp 或通过编译器开关强制执行)。

关于c++ - 如何使用 Make 构建与一些 C++ 代码混合的 C 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16388373/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com