C++ 编译时&;大型C++;项目
假设其中一个有大约50000个不同的C++ 编译时&;大型C++;项目,c++,linux,C++,Linux,假设其中一个有大约50000个不同的.cpp文件 每个.cpp文件只包含一个类,其中包含约1000行代码(代码本身并不复杂,涉及矩阵和向量的内存操作,即不使用特殊的库) 我需要构建一个项目(在Linux环境中),该项目必须导入并使用所有这50000个不同的.cpp文件 我想到了几个问题: 编译这个大概需要多长时间?编译文件的大约大小是多少 有什么更好的方法——保留50000个不同的。因此,文件(编译的扩展名)并让主程序逐个导入它们,或者,将这50000个不同的.cpp文件合并成一个大的.cpp文
.cpp
文件
每个.cpp
文件只包含一个类,其中包含约1000行代码(代码本身并不复杂,涉及矩阵和向量的内存操作,即不使用特殊的库)
我需要构建一个项目(在Linux
环境中),该项目必须导入并使用所有这50000个不同的.cpp
文件
我想到了几个问题:
。因此,
文件(编译的扩展名)并让主程序逐个导入它们,或者,将这50000个不同的.cpp
文件合并成一个大的.cpp
文件,然后处理它?哪种方法更快/更有效任何洞察都非常有用。您可以从一个“.cpp”构建每个对象文件,其中“.h”文件包含大量(我指的是大量)向前声明-因此,当您更改一个
.h
文件时,它不需要重新编译程序的其余部分。通常,函数/方法需要在其parmater中输入对象的名称或返回的内容。如果需要其他详细信息-是,需要包括在内
请买一本斯科特·迈尔斯的书,这本书对你很有帮助
哦,当你想吃一个大蛋糕时,把它分了。切片更容易管理。没有答案,只有建议 回到你身边:你到底想做什么?你想从不同的源文件创建一个代码库吗?或者这是一个可执行文件?你真的编写了那么多.cpp文件吗 50000个源文件很好。。。大规模的工程。您是否尝试在所有文件中执行一些通用的操作(例如,每个源文件都代表一个资源、记录、图像或唯一的内容)。或者仅仅是5万个不同的代码文件 大部分编译时间不会基于每个源文件的大小。它将基于将随每个cpp文件引入的头文件的数量(及其包含的头文件)。头文件虽然通常不包含实现,但只包含声明,必须经过编译过程。代码库中的冗余头会降低构建速度 这种规模的大型项目使用。您可以在一个头文件(common.h)和build common.h中包含所有常用的头文件。然后所有其他源文件只包含“common.h”。编译器可以配置为在看到每个源的#include“common.h”时自动使用编译的头文件。(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。。。文件编号
然后,当您构建自己的代码时,您的最终链接如下所示:
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。。。o-o libvector.so
然后,当您构建自己的代码时,您的最终链接如下所示:
g++myfile.cpp libvector.so-o mytask
您需要libvector.so位于加载程序的路径中,才能使可执行文件正常工作
在任何情况下,只要50000个文件不变,您只需执行最后一个命令(速度会快得多)。我们不能确切地说编译需要多长时间,但您应该做的是将每个
.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...
您使用
。因此
s的想法实际上是在问“我能以多快的速度使程序崩溃,可能还会使操作系统崩溃?”。共享库适用于少量的大型库,而不是50000个。因此
s链接到二进制文件(特别是如果动态加载它们…那将是不好的)。没有人能够回答您问题的第一部分。编译程序的时间及其结果大小在很大程度上取决于代码的实际内容。“.so文件(编译的扩展名)…将这50000个不同的.cpp文件合并成一个大的.cpp”A。与.DLL相当的非Windows文件也是如此。您不需要将.cpp文件编译成.so文件;您可以将它们编译成对象文件(.o、.obj或其他任何文件),这些文件都链接到某种形式的库中,静态(.a)或动态(.so)。有许多.cpp文件或只有一个文件对.so构建过程来说并不重要。因此,使用.So与您拥有多少.cpp文件无关。我们通常的回答是“请发布您的代码”,这可能会对50K源文件提出不好的建议。:)为了说明杰姆斯的观点,编写一个C++程序可以解决编译时的N皇后问题,如果你试图编译这个小程序来解决一个30x30的单板问题,那么你可能需要花费地球上其他的时间来编译你的程序,而且二进制文件的大小会比你的硬盘大;时间g++all.cp