C++;内部代码重用:编译所有内容还是共享库/动态库? 一般问题: 上面,C++的简单之处是什么? 不创建可重用的二进制文件 组件;相反,C++使它 相对容易重用源代码。 注意,大多数主要C++库都是 以源代码形式提供,未编译 形式。经常有必要这样做 看看那个来源,以便 从对象正确继承,并且 这太容易了(而且经常如此) (必要时)依靠实施 原始库的详细信息 你可以重复使用它。好像这还不错 够了,这通常很诱人(或者 (必要时)修改原件 源代码,并对 图书馆。(共有多少个私人建筑 有MFC吗?世界永远不会 知道……)

C++;内部代码重用:编译所有内容还是共享库/动态库? 一般问题: 上面,C++的简单之处是什么? 不创建可重用的二进制文件 组件;相反,C++使它 相对容易重用源代码。 注意,大多数主要C++库都是 以源代码形式提供,未编译 形式。经常有必要这样做 看看那个来源,以便 从对象正确继承,并且 这太容易了(而且经常如此) (必要时)依靠实施 原始库的详细信息 你可以重复使用它。好像这还不错 够了,这通常很诱人(或者 (必要时)修改原件 源代码,并对 图书馆。(共有多少个私人建筑 有MFC吗?世界永远不会 知道……),c++,unmanaged,code-reuse,C++,Unmanaged,Code Reuse,不管是哪一种:您减少重复代码(复制粘贴综合症)的策略是什么,代码膨胀 具体示例: 以下是我们在我的组织中共享代码的方式: 我们通过共享实际的源代码来重用代码。 我们使用VS2008在Windows上开发,尽管我们的项目实际上需要跨平台。我们有许多项目(.vcproj)提交到存储库;有些可能有自己的存储库,有些可能是存储库的一部分。对于每个可交付的解决方案(.sln)(例如,我们交付给客户的东西),它将从存储库中svn:external所有必要的项目(.vcproj),以组装“最终”产品 这很好

不管是哪一种:您减少重复代码(复制粘贴综合症)的策略是什么,代码膨胀


具体示例: 以下是我们在我的组织中共享代码的方式:

我们通过共享实际的源代码来重用代码。

我们使用VS2008在Windows上开发,尽管我们的项目实际上需要跨平台。我们有许多项目(.vcproj)提交到存储库;有些可能有自己的存储库,有些可能是存储库的一部分。对于每个可交付的解决方案(.sln)(例如,我们交付给客户的东西),它将从存储库中svn:external所有必要的项目(.vcproj),以组装“最终”产品

这很好,但我很担心最终每个解决方案的代码大小可能会变得相当大(目前我们的代码总大小约为75K SLOC)

还有一点需要注意的是,我们防止了all传递依赖。也就是说,每个不是实际解决方案(.sln)的项目(.vcproj)都不允许svn:external任何其他项目,即使它依赖于它。这是因为您可能有两个项目(.vcproj),它们可能依赖于同一个库(即Boost)或项目(.vcproj),因此当您svn:externals将两个项目合并到一个解决方案中时,svn:externals将执行两次。因此,我们仔细记录每个项目的所有依赖项,由创建解决方案(.sln)的guy来确保所有依赖项(包括可传递的)都是svn:externals,作为解决方案的一部分

如果我们通过使用.lib、.dll来重用代码,这显然会减少每个解决方案的代码大小,并在适用的情况下消除上述可传递的依赖关系(例外情况是,使用dll的第三方库/框架,如英特尔TBB和默认Qt)


附录:(如果愿意,请阅读)

共享源代码的另一个动机可以概括为:

<> P>上面,C++的简单之处是什么? 不创建可重用的二进制文件 组件;相反,C++使它 相对容易重用源代码。 注意,大多数主要C++库都是 以源代码形式提供,未编译 形式。经常有必要这样做 看看那个来源,以便 从对象正确继承,并且 这太容易了(而且经常如此) (必要时)依靠实施 原始库的详细信息 你可以重复使用它。好像这还不错 够了,这通常很诱人(或者 (必要时)修改原件 源代码,并对 图书馆。(共有多少个私人建筑 有MFC吗?世界永远不会 知道……)

也许这就是为什么当您查看像“英特尔数学内核库”这样的库时,在它们的“lib”文件夹中,每个Visual Studio版本都有“vc7”、“vc8”、“vc9”。可怕的东西

或者,断言如何:

C++是出了名的不适应 当涉及到插件时。C++是 非常特定于平台,并且 特定于编译器。C++标准 不指定应用程序二进制文件 接口(ABI),即C++ 来自不同编译器或 即使是同一个版本的不同版本 编译器不兼容。再加上 C++没有概念的事实 每个平台的动态载荷和载荷 提供自己的解决方案(不兼容) (和其他人)你就明白了


你对上述断言有何看法?像Java或.NET这样的东西会面临这些问题吗?e、 g.如果我从Netbeans生成一个JAR文件,只要我确保两者都具有兼容的JRE/JDK,那么我将其导入IntelliJ是否有效?

人们似乎认为C指定了一个ABI。没有,我也不知道有哪种标准化编译语言能做到这一点。为了回答你的主要问题,图书馆的使用当然是一条路——我无法想象做其他任何事情。

我们也这么做。如果您需要在不同的平台、构建环境上使用共享代码,或者即使您需要不同的构建选项,例如静态与动态链接到C运行时、不同的结构打包设置等,尝试使用二进制文件可能是一个真正的问题

我通常将项目设置为尽可能多地从源代码按需构建,即使使用第三方代码,如zlib和libpng。对于那些必须单独构建的东西,例如Boost,我通常必须为所需的各种设置组合(debug/release、VS7.1/VS9、static/dynamic)构建4或8组不同的二进制文件,并在源代码管理中管理二进制文件以及调试信息文件


当然,如果每个共享代码的人都在同一平台上使用相同的工具和相同的选项,那么情况就不同了。

我从未见过共享库是将旧项目中的代码重用到新项目中的一种方式。我一直认为,这更多的是在同一时间开发的不同应用程序之间共享一个库,以最大限度地减少膨胀

就复制粘贴综合症而言,如果我复制并粘贴它在多个地方,它需要有自己的功能。这与库是否共享无关

当我们重用旧项目中的代码时,我们总是将其作为源代码引入。总有一些东西需要调整,调整特定于项目的版本通常比调整共享版本更安全,因为共享版本可能会破坏以前的项目。回过头来修复上一个项目是不可能的,因为1)它已经工作(并且已经发布),2)它不再有资金,3)测试已经完成
void Foo:Send(unsigned messageID, const void* buffer, size_t bufSize);
void Foo:SendMultiple(unsigned messageID, const void** buffer, size_t* bufSize);