繁体   English   中英

Makefile可同时编译c和cpp文件

[英]Makefile to compile both c and cpp files

我想编译我的程序,但是这样做有一些问题。 我的程序由用C编写的主要函数组成。其他文件是我尚未编写的.h或.cpp文件。 我有一个生成文件,但不幸的是我无法编译程序。 这是文件的“架构”:

ah只包含常量的定义。

bh和b.cpp。 b.cpp包括啊

ch和d.cpp。 ch包含d.cpp方法的签名。 d.cpp包括ah,bh和ch

最后一个文件是main.c,其中包括ch

我使用的makefile文件如下:

CXX      = g++
CXXFLAGS = -Wall -ansi -g
CC       = gcc
CCFLAGS  = -g
OBJS     = main.o a.o b.o c.o

exec : $(OBJS)
    $(CXX) -o $@ $(OBJS)

c.o: d.cpp b.h a.h  
    $(CXX) -c $(CXXFLAGS) $<

a.o: a.h
    $(CXX) -c $(CXXFLAGS) $<

b.o: b.cpp a.h
    $(CXX) -c $(CXXFLAGS) $<

%.o : %.cpp
    $(CXX) -c $(CXXFLAGS) $<

%.o : %.c
    $(CC) -c $(CCFLAGS) $<

有人可以在我错的地方吗? 此外,如何修改makefile,以便可以将a,b,c和d文件放在子文件夹中而不会引起任何问题?

谢谢 !

编辑:这是我得到的错误:

g++ -o tester main.o a.o b.o c.o
Undefined symbols for architecture x86_64:
    "_crypto_aead_encrypt", referenced from:
         _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [tester] Error 1

该函数在ch中声明并在d.cpp中定义

最可能的原因是main所包含的ch中的定义在编译main.c时被编译为extern“ C”,但是在被编译为d.cpp时被编译为C ++ extern(名称重整)。

(如果ch是crypto_aead_encrypt函数的来源位置)

一种简单的解决方案是将所有内容都编译为C ++(将main重命名为.cpp,或者使用$ {CXX}编译main.c并将“ -x c ++”添加到CXXFLAGS)。

不太容易的解决方案在编译d.cpp时需要将ch方法编译为外部“ C”-这需要更改ch和/或d.cpp。 或为ch包含的C ++方法提供C包装器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM