我正在浏览git源代码,我想知道入口文件在哪里?我已经浏览了几个文件,但没有找到主函数。
我可能错了,但我相信入口点在common-main.c
文件中的main()
函数。
int main(int argc, const char **argv)
{
/*
* Always open file descriptors 0/1/2 to avoid clobbering files
* in die(). It also avoids messing up when the pipes are dup'ed
* onto stdin/stdout/stderr in the child processes we spawn.
*/
sanitize_stdfds();
git_setup_gettext();
git_extract_argv0_path(argv[0]);
restore_sigpipe_to_default();
return cmd_main(argc, argv);
}
cmd_main(argc, argv)
。有许多cmd_main()
的定义,但我认为这里返回的是在git.c
中定义的一个,它有点长,无法完整地在此发布,但以下是摘录的部分:int cmd_main(int argc, const char **argv)
{
const char *cmd;
cmd = argv[0];
if (!cmd)
cmd = "git-help";
else {
const char *slash = find_last_dir_sep(cmd);
if (slash)
cmd = slash + 1;
}
/*
* "git-xxxx" is the same as "git xxxx", but we obviously:
*
* - cannot take flags in between the "git" and the "xxxx".
* - cannot execute it externally (since it would just do
* the same thing over again)
*
* So we just directly call the builtin handler, and die if
* that one cannot handle it.
*/
if (skip_prefix(cmd, "git-", &cmd)) {
argv[0] = cmd;
handle_builtin(argc, argv);
die("cannot handle %s as a builtin", cmd);
}
handle_builtin()
也在 git.c
中定义。
也许最好澄清一下误解。Git 是一种收集、记录和归档项目目录更改的方式。这是版本控制系统的目的,而 Git 可能是其中较为知名的一个。
有时它们还提供构建自动化,但通常最好的工具专注于最少的职责。在 Git 的情况下,它主要关注提交到存储库以保留初始化目录的不同状态。它不会构建程序,因此入口点不受影响。
main
,但也有重新定义或隐藏此入口点的方法。例如,Arduino 使用 setup
作为入口点,然后调用 loop
。
@larks 留下的评论是一种在不确定时查找入口点的简单方法。从 git 存储库的根目录开始进行简单的递归搜索,可以在任何包含的文件中查找单词 main
。grep main *.c
Windows的等效命令是FINDSTR
,但最近更新的Windows 10大大提高了与Bash命令的兼容性。我正在运行的版本中可以使用grep
。同样可以使用ls
,尽管我不确定它是否一直存在。
.c
是找到 C 组件入口点的好方法,前提是代码具有足够高的质量以使您想要首先运行它。