菜鸟又来问:GCC 编译器编译时如何按扩展名查找源文件

时间:2022-05-10 13:31:44
如果我手工写个 makefile 来编译是可以指定编译 *.m 源文件的,但我现在用 Eclipse CDT,而且Object-C源码是生成的,同时包括 .c 和 .m 两种源文件,不知道怎么告诉 makefile 把 .m 文件也当成 .c 一样地去编译。

哪位大侠知道有没有gcc 命令行参数告诉 GCC 两种扩展名都是源文件,让GCC把两种扩展名都当成 .c 一样处理?
我这源代码都是自动生成的,我不想每次都去把文件改名。

CC=/usr/local/bin/arm-apple-darwin9-gcc
CXX=/usr/local/bin/arm-apple-darwin9-g++
LD=$(CC)
LDID=/usr/local/bin/arm-apple-darwin9-ld

all: HelloWorld

HelloWorld:    HelloWorld.o
$(LD) $(LDFLAGS) -o $@ $^

%.o:    %.m
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

clean:
rm *.o HelloWorld

5 个解决方案

#1


-std=c99

#2


$(CC) -c -std=c99 $(CFLAGS) $(CPPFLAGS) $< -o $@

#3


makefile 里 把 %.o: %.m 那两行copy一下,改成 %.o: %.c

%.o: %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

#4


看来这个问题描述错了,其实我的 toolchain 是可以编译 object-c 源码的,只是 Eclipse CDT 没有把 *.m 当成文件。

这是 Eclipse CDT 自动生成的源码,这里的 "../src/Classes/ZipArchive/minizip/ioapi.c" 是 Eclipse CDT 自动填充的,它只扫描 *.c , *.cpp 之类的源文件,像 *.m 就都没有编译。现在我不知道怎么让 Eclipse CDT 能把 *.c, *.m 都当成源文件去编译。

在 Eclipse CDT 配置界面上,说命令行格式是:
${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

这里的 ${INPUTS} 将会被填充 xxx.c xxx.cpp 这类的单个文件名,但把 *.m 都不当成源文件,所以当我在跑 linker 时会说一大堆的 Undefined symbols.


[code=Unix]
/usr/local/bin/arm-apple-darwin9-gcc -I/usr/local/lib/gcc/arm-apple-darwin9/4.2.1/include -O0 -g3 -Wall -c -std=c99 -fmessage-length=0 -framework CoreFoundation -framework Foundation -framework UIKit  -lobjc -bind_at_load -isysroot /usr/local/iphone-sysroot -MMD -MP -MF"src/Classes/ZipArchive/minizip/ioapi.d" -MT"src/Classes/ZipArchive/minizip/ioapi.d" -o "src/Classes/ZipArchive/minizip/ioapi.o" "../src/Classes/ZipArchive/minizip/ioapi.c"
[/code]

#5


我找到办法了,原来在 Eclipse CDT 的全局参数 $Menu > Window > Preference # C/C++ > File Types 里面,默认已经把 *.c 注册成了 C Source File, *.cpp/*.cxx 注册成 C++ Source File, *.h 注册成 C Header File, *.hpp 注册成了 C++ Header File,现在我手工添加一个 *.m 注册成 C Source File 就可以了。

添加之后,Eclipse CDT 在生成 makefile 文件时,会搜索每个目录下的 C Source File 文件,并添加到待编译文件列表中,这样我的 *.m 也出现在这个 subdir.mk 文件中啦。

#1


-std=c99

#2


$(CC) -c -std=c99 $(CFLAGS) $(CPPFLAGS) $< -o $@

#3


makefile 里 把 %.o: %.m 那两行copy一下,改成 %.o: %.c

%.o: %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@

#4


看来这个问题描述错了,其实我的 toolchain 是可以编译 object-c 源码的,只是 Eclipse CDT 没有把 *.m 当成文件。

这是 Eclipse CDT 自动生成的源码,这里的 "../src/Classes/ZipArchive/minizip/ioapi.c" 是 Eclipse CDT 自动填充的,它只扫描 *.c , *.cpp 之类的源文件,像 *.m 就都没有编译。现在我不知道怎么让 Eclipse CDT 能把 *.c, *.m 都当成源文件去编译。

在 Eclipse CDT 配置界面上,说命令行格式是:
${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

这里的 ${INPUTS} 将会被填充 xxx.c xxx.cpp 这类的单个文件名,但把 *.m 都不当成源文件,所以当我在跑 linker 时会说一大堆的 Undefined symbols.


[code=Unix]
/usr/local/bin/arm-apple-darwin9-gcc -I/usr/local/lib/gcc/arm-apple-darwin9/4.2.1/include -O0 -g3 -Wall -c -std=c99 -fmessage-length=0 -framework CoreFoundation -framework Foundation -framework UIKit  -lobjc -bind_at_load -isysroot /usr/local/iphone-sysroot -MMD -MP -MF"src/Classes/ZipArchive/minizip/ioapi.d" -MT"src/Classes/ZipArchive/minizip/ioapi.d" -o "src/Classes/ZipArchive/minizip/ioapi.o" "../src/Classes/ZipArchive/minizip/ioapi.c"
[/code]

#5


我找到办法了,原来在 Eclipse CDT 的全局参数 $Menu > Window > Preference # C/C++ > File Types 里面,默认已经把 *.c 注册成了 C Source File, *.cpp/*.cxx 注册成 C++ Source File, *.h 注册成 C Header File, *.hpp 注册成了 C++ Header File,现在我手工添加一个 *.m 注册成 C Source File 就可以了。

添加之后,Eclipse CDT 在生成 makefile 文件时,会搜索每个目录下的 C Source File 文件,并添加到待编译文件列表中,这样我的 *.m 也出现在这个 subdir.mk 文件中啦。