问题标签 [parallel-builds]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
82 浏览

c - 并行构建 C 程序

*.c我有一个由许多单元文件组成的中型项目。

在“正常”编译练习中,程序是从其目标文件构建的,这些目标文件作为配方*.o中主程序的先决条件传递。Makefile这适用于并行构建:使用make -j,所有这些目标文件都并行编译,然后在最后链接在一起。它使整个构建体验更快。

但是,在其他情况下,先决条件列表作为*.c单元文件列表而不是 *.o目标文件列表传递。最初的意图是不构建这些目标文件,因为它们可能会污染缓存。现在,这可能会以不同的方式完成,但是对于这个特定的项目,Makefile是一个不可变的对象,所以它不能被更新,我们必须忍受它。

make -j在这种情况下, using无效,因为gcc将有效地直接在单个命令行上接收完整的单位列表。这意味着,make不再能够组织并行性。

我剩下的唯一机会是将标志和参数传递给make. 我试图找到一个可以gcc在内部并行编译单元列表的方法。我找不到任何东西。在互联网上搜索,我发现猜测说“既然make可以并行构建,gcc就不需要复制这个功能”。但没有解决办法。

那么问题来了:如何处理呢?

假设像这样的编译行gcc *.c -o final_exe,可以通过标准标志(、、、、)进行更改CC,是否CFLAGS有任何选项可以使其并行构建这些单元?CPPFLAGSLDFLAGS

0 投票
0 回答
30 浏览

cmake - 使用 ADD_CUSTOM_TARGET() 创建的 cmake 目标在并行模式下生成多次

我有项目名称libtld,我首先在其中创建了一个工具¹:

然后我使用该工具生成tld_data.c文件,这是一个包含所有 TLD 的表(在我的新版本库中,这是 RIFF/TLDS 二进制文件的副本,将在内部作为后备进行编译)。这是add_custom_command()我用来生成所述文件的:

接下来我要生成 tld 动态和静态库。

我将其添加add_dependencies()tld_static项目中以依赖于对tld我的情况有所帮助的想法,但我仍然看到两次运行tld_parser...

我还有一个直接包含该tld_data.c文件的测试(这样我可以直接验证该tld()函数是否返回了我对确切源数据的期望)。

添加add_dependencies()到测试中按预期工作。而不是tld_data.c创建文件三次,现在只创建两次。

通过终止并行构建功能,它可以按预期工作,但是,我应该没有充分的理由这样做(请参阅此 cmake 问题以供参考)。

不过,我想知道的是:

你如何调试这样的问题?

cmake 的 Makefile 是巨大的,所以阅读它们是相当致命的。如果我知道要搜索什么,我想我至少可以查看特定目标,而不是试图了解那里发生的所有事情(其中大部分与我的问题无关)。


¹代码目前在一个分支中。我希望尽快将其全部结束,届时它将取代主分支。tld()功能界面不会有太大变化。然而,实现将完全不同,更灵活,可动态更新。