Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么许多项目不提供预编译的二进制文件?_C++_Libraries - Fatal编程技术网

C++ 为什么许多项目不提供预编译的二进制文件?

C++ 为什么许多项目不提供预编译的二进制文件?,c++,libraries,C++,Libraries,这个问题对我来说已经有相当长的时间了。我不经常使用C++,而且大多数CPP库都是作为源代码的zip文件或TAR球提供的。 因此,问题是: 为什么这些项目不提供预编译的二进制文件 我目前对autoconf,make,make-install。。。这个过程是确保一切都是正确的,然后将源代码编译成一个可执行文件或一些库。但是如果我们最终得到的是相同的东西,为什么每次都要编译它呢?我并不是要为编译的libs维护一个单独的项目,但是在调试和测试过程中,这些文件应该自动生成,为什么不把它们放到发布文件中呢

这个问题对我来说已经有相当长的时间了。我不经常使用C++,而且大多数CPP库都是作为源代码的zip文件或TAR球提供的。 因此,问题是:

为什么这些项目不提供预编译的二进制文件

我目前对autoconf,make,make-install。。。这个过程是确保一切都是正确的,然后将源代码编译成一个可执行文件或一些库。但是如果我们最终得到的是相同的东西,为什么每次都要编译它呢?我并不是要为编译的libs维护一个单独的项目,但是在调试和测试过程中,这些文件应该自动生成,为什么不把它们放到发布文件中呢


例如:FTGL库的源代码附带visual studio解决方案文件.sln,如果他们使用该文件进行开发和调试,为什么不将编译后的二进制文件放入发布文件中?

平台通常有一个通用的C ABI,它规定符号命名、函数调用约定和其他低级细节。以ABI为目标的编译器可以与执行相同操作的其他编译器进行互操作。Linux库和Windows库不兼容,但通常可以为每个目标平台构建少量版本:一个用于Linux,一个用于Windows,等等

<>没有C++库的标准。不同的编译器不同。编译后的C++库通常只能由同一版本的编译器在同一版本中使用。由同一编译器的不同版本编译的库甚至不一定是兼容的。要预构建一个库,您必须使用几十个版本的g++、几十个版本的clang等进行构建。。。这不实际

<>分发C++库是困难的。一些常见的策略是:

仅设置库标题,以便最终用户只包含库标题。不需要汇编

分发头文件和源文件,并要求最终用户构建库

在C中实现库,并在头文件中提供C++包装器。库可以同时使用C和C++程序。如果需要,可以预先构建C部分

前一个子弹的逆,在C++中实现库并添加C包装器。包装器将定义一组独立的外部C函数,这些函数调用C++代码。 例如,Boost混合使用了策略1和策略2。如果您只使用Boost中只有头的部分,那么您所要做的就是将它们的头包含在您的程序中,非常简单。如果您使用的是线程或正则表达式组件之类的非标题部分,那么您必须编译它们,这需要一段时间


3和4对于您不想分发代码的专有库很有用。

平台通常有一个通用的C ABI,用于指定符号命名、函数调用约定和其他低级细节。以ABI为目标的编译器可以与执行相同操作的其他编译器进行互操作。Linux库和Windows库不兼容,但通常可以为每个目标平台构建少量版本:一个用于Linux,一个用于Windows,等等

<>没有C++库的标准。不同的编译器不同。编译后的C++库通常只能由同一版本的编译器在同一版本中使用。由同一编译器的不同版本编译的库甚至不一定是兼容的。要预构建一个库,您必须使用几十个版本的g++、几十个版本的clang等进行构建。。。这不实际

<>分发C++库是困难的。一些常见的策略是:

仅设置库标题,以便最终用户只包含库标题。不需要汇编

分发头文件和源文件,并要求最终用户构建库

在C中实现库,并在头文件中提供C++包装器。库可以同时使用C和C++程序。如果需要,可以预先构建C部分

前一个子弹的逆,在C++中实现库并添加C包装器。包装器将定义一组独立的外部C函数,这些函数调用C++代码。 例如,Boost混合使用了策略1和策略2。如果您只使用Boost中只有头的部分,那么您所要做的就是将它们的头包含在您的程序中,非常简单。如果您使用的是线程或正则表达式组件之类的非标题部分,那么您必须编译它们,这需要一段时间


3和4对于您不想分发代码的专有库很有用。

根据您的平台,生成的二进制文件会有很大不同。例如,您可以运行Linux、Mac或Windows,并且可以运行64位或32位体系结构

如果我将windows 32位二进制文件传递给您,而您的系统是64位Mac t 他将是完全不相容的


有些项目确实为每个平台提供了二进制文件,或者可能提供了一些精选的二进制文件,但是如果您希望修改源代码,只使用其中的某些部分,或者只是简单地理解它,这仍然很好。

根据您的平台,生成的二进制文件将非常不同。例如,您可以运行Linux、Mac或Windows,并且可以运行64位或32位体系结构

如果我将windows 32位二进制文件传递给您,而您的系统是64位Mac,那么该二进制文件将完全不兼容


有些项目确实为每个平台提供了二进制文件,或者可能提供了一些精选的二进制文件。但是,如果您希望修改源代码,只使用源代码的某些部分,或者只是简单地理解源代码,那就太好了。

因为不同的操作系统和发行版需要不同的二进制文件。嗯,您能更具体一点吗?二进制文件具体用于哪个平台、什么体系结构、ABI、优化级别?矢量指令打开或关闭?此外,不同的编译器使用不同的库格式、对象文件格式、调试信息格式,这几天我不想下载二进制文件,而是想让代码支持使用CMake生成我的Visual Studio或其他IDE项目文件。因为不同的操作系统和发行版需要不同的二进制文件。嗯,你能更具体一点吗?二进制文件具体用于哪个平台、什么体系结构、ABI、优化级别?矢量指令打开还是关闭?此外,不同的编译器使用不同的库格式、对象文件格式、调试信息格式等。这些天我不喜欢下载二进制文件,而是希望使用CMake生成代码支持生成Visual Studio或其他IDE项目文件。