假设一个人有大约50,000个不同的.cpp
个文件。
每个.cpp
文件包含只有一个类,其中包含大约1000行代码(代码本身并不复杂 - 涉及矩阵和向量中的内存操作 - 即,没有使用特殊的库。)
我需要构建一个必须导入的项目(在Linux
环境中)。使用所有这50,000个不同的.cpp
文件。
我想到了几个问题:
.so
文件(编译的扩展)并让主程序逐个导入它们,或者将这50,000个不同的.cpp
文件合并到< em>一个大的 .cpp
文件,只是处理它?哪种方法更快/更有效?任何见解都非常有用。
答案 0 :(得分:2)
没有答案,只是建议。
回到你身边:你真的想做什么?你是不是想从不同的源文件创建一个代码库?或者这是一个可执行文件?你真的编码了很多.cpp文件吗?
50,000个源文件很好......一个大型项目。您是否尝试在所有文件中执行常见操作(例如,每个源文件代表资源,记录,图像或其他独特的内容)。或者它只是50K不同的代码文件?
您的大部分编译时间不会基于每个源文件的大小。它将基于每个cpp文件引入的头文件(以及它们包含的头)的数量。标题虽然通常不包含实现,但只是声明,必须经过编译过程。代码库中的冗余标头可能会减慢构建时间。
这种规模的大型项目使用precompiled headers。您可以将所有常用的头文件包含在一个头文件(common.h)中并构建common.h。然后所有其他源文件只包含“common.h”。编译器可以配置为在看到每个源的#include“common.h”时自动使用编译的头文件。
答案 1 :(得分:0)
您可以使用“.h”文件构建每个目标文件,其中“.h”文件具有许多(并且我很多)前向声明 - 所以当您更改.h
文件时,它不需要重新编译程序的其余部分。通常,函数/方法需要在其parmaters中的对象名称或它正在撤回的内容。如果它需要其他细节 - 是的,它需要包括在内。
请Scott Myers写一本书 - 对你有很大的帮助。
哦 - 当我想吃一块大蛋糕时 - 把它分开了。切片更易于管理。
答案 2 :(得分:0)
(i)确定这个因素涉及太多因素,即使是近似也是不可能的。编译可以是内存,cpu或硬盘绑定。文件的复杂性很重要(根据您的描述,您的复杂性很低)。
(ii)这样做的典型方法是创建一个库,让系统找出链接或加载。您可以选择静态或动态链接。
静态链接
假设您使用的是gcc,它将如下所示:
g++ -c file1.cpp -o file1.o
g++ -c file2.cpp -o file2.o
...
g++ -c filen.cpp -o filen.o
ar -rc libvector.a file1.o file2.o ... filen.o
然后,当您构建自己的代码时,您的最终链接如下所示:
g++ myfile.cpp libvector.a -o mytask
动态链接
同样,假设您使用gcc,这将是这样的:
g++ -c file1.cpp -fPIC -o file1.o
g++ -c file2.cpp -fPIC -o file2.o
...
g++ -c filen.cpp -fPIC -o filen.o
ld -G file1.o file2.o ... filen.o -o libvector.so
然后,当您构建自己的代码时,您的最终链接如下所示:
g++ myfile.cpp libvector.so -o mytask
您将需要libvector.so位于加载程序的路径中,以使您的可执行文件正常工作。
在任何情况下,只要50,000个文件没有改变,你只需要做最后一个命令(这会更快)。
答案 3 :(得分:0)
我们无法真正说出编译所需的时间,但您应该做的是将每个.cpp
/ .h
对编译成.o
文件:
$ g++ -c -o test.o test.cpp ...
完成所有这些后,您将编译主程序:
$ g++ -c -o main.o main.cpp
$ g++ -o main main.o test.o blah.o otherThings.o foo.o bar.o baz.o etc...
您使用.so
的想法几乎是在问“我有多快可以使程序崩溃,可能还会破坏操作系统?”。共享库适用于少量的大型库,而不是50,000 .so
个链接到二进制文件(尤其是,如果你动态加载它们......那将是 BAD 强>)。