C++ 编译时&;大型C++;项目

C++ 编译时&;大型C++;项目,c++,linux,C++,Linux,假设其中一个有大约50000个不同的.cpp文件 每个.cpp文件只包含一个类,其中包含约1000行代码(代码本身并不复杂,涉及矩阵和向量的内存操作,即不使用特殊的库) 我需要构建一个项目(在Linux环境中),该项目必须导入并使用所有这50000个不同的.cpp文件 我想到了几个问题: 编译这个大概需要多长时间?编译文件的大约大小是多少 有什么更好的方法——保留50000个不同的。因此,文件(编译的扩展名)并让主程序逐个导入它们,或者,将这50000个不同的.cpp文件合并成一个大的.cpp文

假设其中一个有大约50000个不同的
.cpp
文件

每个
.cpp
文件只包含一个类,其中包含约1000行代码(代码本身并不复杂,涉及矩阵和向量的内存操作,即不使用特殊的库)

我需要构建一个项目(在
Linux
环境中),该项目必须导入并使用所有这50000个不同的
.cpp
文件

我想到了几个问题:

  • 编译这个大概需要多长时间?编译文件的大约大小是多少
  • 有什么更好的方法——保留50000个不同的
    。因此,
    文件(编译的扩展名)并让主程序逐个导入它们,或者,将这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