我找不到ARM GNU工具链的选项来同时编译多个c文件。我在使用gcc编译时一直使用make -j5。有助于大大加快编译时间。如果ARM GNU有类似的选择,那就太好了。
这是我的设置: --Fedora 20 - 核心i5 - 使用ARM GNU插件的Eclipse --ARM GNU 4.8-2014-q1-update(从这里:https://launchpad.net/gcc-arm-embedded) - 目标uP:STM32F205RB
我试图使CodeSourcery GCC正常工作,但未成功。经过一些设置后,ARM GNU似乎运行良好。 CodeSourcery GCC应该有一个-j选项,因为我们一直在为嵌入式linux交叉编译。
答案 0 :(得分:2)
GCC不是多线程的。 -j<n>
开关特定于make
构建系统,而不是编译器。它告诉make
它可以并行运行多少任务。
如果您运行make -j4
,您可以在任务管理器/热门/进程列表中观察到它尝试运行4个GCC实例同时编译4个独立的*.c
文件。
要使用-j
命令,您的项目中必须有Makefile
才能从中受益。它应该有多个独立的目标,以便它们可以并行启动。
如果您在术语中迷失了,我建议您查看make
教程,例如:
http://mrbook.org/tutorials/make/
此处通常的策略是为项目中的每个c
或cpp
文件设置单独的目标。这样make就可以轻松地为每个编译单元生成多个编译器进程。生成所有* .o文件后,它们就会被链接。
让我们看看这个示例代码段:
SRCS := main.c func.c other.c another_file.c ...
OBJS := $(SRCS:.c=.o)
objects: $(OBJS)
%.o: %.c
gcc -o $(@) -c $(<)
我们传递c
个文件列表,使用后缀替换将其更改为相应的o
文件,并将*.o
个文件列表视为目标。现在make
可以并行编译每个c
文件。
相反,如果我们做这样的事情:
SRCS := main.c func.c other.c another_file.c ...
all:
gcc $(SRCS) -o a.out
...我们根本没有从-j
切换中获益,因为只有一个目标。