哪位大侠知道有没有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 $@
%.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]
这是 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 文件中啦。
添加之后,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 $@
%.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]
这是 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 文件中啦。
添加之后,Eclipse CDT 在生成 makefile 文件时,会搜索每个目录下的 C Source File 文件,并添加到待编译文件列表中,这样我的 *.m 也出现在这个 subdir.mk 文件中啦。