问题标签 [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.
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
有任何选项可以使其并行构建这些单元?CPPFLAGS
LDFLAGS
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()
功能界面不会有太大变化。然而,实现将完全不同,更灵活,可动态更新。