Eclipse CDT 在幕后用 'make' 做什么
What is Eclipse CDT is doing with 'make' under the hood
我在 Windows 7 上并且安装了 MinGW/gcc。我正在使用 Eclipse CDT plugin 来编译和构建我的第一个简单的 C 程序,并试图了解插件在幕后所做的事情。
我创建一个新的 "Hello World!" C 项目,目录结构如下:
helloworld/
src/
helloworld.c
其中 helloworld.c
是:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts("Hello World!");
return EXIT_SUCCESS;
}
所以我在调试模式下创建了一个 运行 配置(与 "Release Mode" 相反, 而不是 典型 Eclipse 说法中的 "Debug Configuration"! ) 和 运行 我的应用程序,它运行良好,将 "Hello World!" 打印到 Eclipse 控制台。
现在我正在查看我的文件系统,file/project 结构如下:
helloworld/
src/
helloworld.c
Debug/
src/
helloworld.d
helloworld.o
subdir.mk
helloworld.exe
makefile
objects.mk
source.mk
我假设 运行在 Eclipse 中设置我的 运行 配置(因此 compiling/building/running helloworld
在 Eclipse 中)创建了一切在 Debug
之下。此外,我假设 helloworld.d
和 helloworld.o
是已编译的二进制文件,而 helloworld.exe
是打包的可执行文件,其中包含这些二进制文件以及它们链接到的所有内容(stdio
和 stdlib
).我还假设 makefile
是实际的 Make 文件 (buildscript),并且 *.mk
文件以某种方式输入到该构建脚本。所以,对于初学者,如果这些假设有任何错误,请先纠正我!
当我打开 makefile
时,我看到了这个:
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
-include ../makefile.init
RM := rm -rf
# All of the sources participating in the build are defined here
-include sources.mk
-include src/subdir.mk
-include subdir.mk
-include objects.mk
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif
-include ../makefile.defs
# Add inputs and outputs from these tool invocations to the build variables
# All Target
all: helloworld
# Tool invocations
helloworld: $(OBJS) $(USER_OBJS)
@echo 'Building target: $@'
@echo 'Invoking: Cross GCC Linker'
gcc -o "helloworld" $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building target: $@'
@echo ' '
# Other Targets
clean:
-$(RM) $(EXECUTABLES)$(OBJS)$(C_DEPS) helloworld
-@echo ' '
.PHONY: all clean dependents
.SECONDARY:
-include ../makefile.targets
请注意:我不是在找人向我解释 Make 是如何工作的,我可以为此使用 RTFM ;-)
我只是想了解在 Eclipse 之外从命令行编译、构建和 运行 helloworld
需要什么。我需要调用哪些命令行来完成此操作,为什么?一旦我看到这一点,再结合仔细阅读 Make 文档,我应该能够填补空白并理解正在发生的一切。
这有点取决于 Eclipse 在文件 source.mk
和 objects.mk
中生成的路径,但很可能您需要 cd
到 Debug
文件夹中。
在其中,您可以 运行 make all
编译项目。
如果 Eclipse 生成了绝对路径,您可以从任何地方使用 make -f .../path/to/helloworld/Debug/makefile all
。
*.o 文件是编译生成的目标文件。这些文件通常由如下命令构建:
Gcc -ansi -Wall -pedantic -c helloworld.c -o helloworld.o
(抱歉 gcc 大写,我的 iPad 坚持要更正我的打字)
*.exe 是实际的可执行文件,可能包含也可能不包含库函数。这取决于静态与动态链接。可执行文件通常由以下人员创建:
Gcc helloworld.o -o helloworld.exe
*.d 文件是依赖文件,由 gcc 构建,试图确定文件之间的依赖关系,通常使用以下命令构建
MAKEDEPEND = gcc -M $(CPPFLAGS) -o $*.d $<
(规则取自在线文档)。
所以,为了回答你的最后一个问题,从命令行编译,命令如下:
Foo gcc -ansi -WAll -pedantic helloworld.c -o helloworld.exe
应该可以帮到您。请注意,编译器的标志是我喜欢使用的最低限度,您可能会有一组不同的开关。
希望对您有所帮助,
T
我在 Windows 7 上并且安装了 MinGW/gcc。我正在使用 Eclipse CDT plugin 来编译和构建我的第一个简单的 C 程序,并试图了解插件在幕后所做的事情。
我创建一个新的 "Hello World!" C 项目,目录结构如下:
helloworld/
src/
helloworld.c
其中 helloworld.c
是:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts("Hello World!");
return EXIT_SUCCESS;
}
所以我在调试模式下创建了一个 运行 配置(与 "Release Mode" 相反, 而不是 典型 Eclipse 说法中的 "Debug Configuration"! ) 和 运行 我的应用程序,它运行良好,将 "Hello World!" 打印到 Eclipse 控制台。
现在我正在查看我的文件系统,file/project 结构如下:
helloworld/
src/
helloworld.c
Debug/
src/
helloworld.d
helloworld.o
subdir.mk
helloworld.exe
makefile
objects.mk
source.mk
我假设 运行在 Eclipse 中设置我的 运行 配置(因此 compiling/building/running helloworld
在 Eclipse 中)创建了一切在 Debug
之下。此外,我假设 helloworld.d
和 helloworld.o
是已编译的二进制文件,而 helloworld.exe
是打包的可执行文件,其中包含这些二进制文件以及它们链接到的所有内容(stdio
和 stdlib
).我还假设 makefile
是实际的 Make 文件 (buildscript),并且 *.mk
文件以某种方式输入到该构建脚本。所以,对于初学者,如果这些假设有任何错误,请先纠正我!
当我打开 makefile
时,我看到了这个:
################################################################################
# Automatically-generated file. Do not edit!
################################################################################
-include ../makefile.init
RM := rm -rf
# All of the sources participating in the build are defined here
-include sources.mk
-include src/subdir.mk
-include subdir.mk
-include objects.mk
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif
-include ../makefile.defs
# Add inputs and outputs from these tool invocations to the build variables
# All Target
all: helloworld
# Tool invocations
helloworld: $(OBJS) $(USER_OBJS)
@echo 'Building target: $@'
@echo 'Invoking: Cross GCC Linker'
gcc -o "helloworld" $(OBJS) $(USER_OBJS) $(LIBS)
@echo 'Finished building target: $@'
@echo ' '
# Other Targets
clean:
-$(RM) $(EXECUTABLES)$(OBJS)$(C_DEPS) helloworld
-@echo ' '
.PHONY: all clean dependents
.SECONDARY:
-include ../makefile.targets
请注意:我不是在找人向我解释 Make 是如何工作的,我可以为此使用 RTFM ;-)
我只是想了解在 Eclipse 之外从命令行编译、构建和 运行 helloworld
需要什么。我需要调用哪些命令行来完成此操作,为什么?一旦我看到这一点,再结合仔细阅读 Make 文档,我应该能够填补空白并理解正在发生的一切。
这有点取决于 Eclipse 在文件 source.mk
和 objects.mk
中生成的路径,但很可能您需要 cd
到 Debug
文件夹中。
在其中,您可以 运行 make all
编译项目。
如果 Eclipse 生成了绝对路径,您可以从任何地方使用 make -f .../path/to/helloworld/Debug/makefile all
。
*.o 文件是编译生成的目标文件。这些文件通常由如下命令构建:
Gcc -ansi -Wall -pedantic -c helloworld.c -o helloworld.o
(抱歉 gcc 大写,我的 iPad 坚持要更正我的打字)
*.exe 是实际的可执行文件,可能包含也可能不包含库函数。这取决于静态与动态链接。可执行文件通常由以下人员创建:
Gcc helloworld.o -o helloworld.exe
*.d 文件是依赖文件,由 gcc 构建,试图确定文件之间的依赖关系,通常使用以下命令构建
MAKEDEPEND = gcc -M $(CPPFLAGS) -o $*.d $<
(规则取自在线文档)。
所以,为了回答你的最后一个问题,从命令行编译,命令如下:
Foo gcc -ansi -WAll -pedantic helloworld.c -o helloworld.exe
应该可以帮到您。请注意,编译器的标志是我喜欢使用的最低限度,您可能会有一组不同的开关。
希望对您有所帮助, T