2

即使已经在网上挖掘了大量关于此的信息,我仍然无法理解 boost lib 文件。我安装了 Boost 1.51 并且 lib 文件夹是 1.7GB,这实在是太多了。我需要减少它。

只是为了展示一个例子:http: //i.imgur.com/6nXfVEr.png

这就是所有的正则表达式库文件夹。其中有10个!我想删除其中的大部分,但我很难理解我需要哪些文件夹。

我假设'libboost'是静态库(不需要DLL),而其他库是动态的。这是否意味着如果我在项目中使用需要 boost DLL 的动态库?

我还可以看到有些是调试的,有些不是。有必要同时保留吗?或者我可以总是为我的项目使用非调试版本吗?

最后,我的想法是否正确,让 Visual Studio 选择特定的库,我去: C/C++ project settings -> Code Generation -> Runtime Library,并在 /MT、/MD 等之间进行更改?如果我使用多线程 (/MT),这是否意味着我可以删除所有调试库和 dll,因为此选项仅使用静态库?

感谢您的任何建议。

4

1 回答 1

3

我假设'libboost'是静态库(不需要DLL),而其他库是动态的。

是的。

这是否意味着如果我在项目中使用需要 boost DLL 的动态库?

是的。

最后,我的想法是否正确,要让 Visual Studio 选择特定的库,我转到:C/C++ 项目设置 -> 代码生成 -> 运行时库,并在 /MT、/MD 等之间进行更改?

不完全如此。设置 /MT 或任何其他类似选项只会使您的应用程序使用相应版本的运行时库(例如 CRT)。这并不意味着您只能在此之后进行静态链接,它也不会为您自己的项目特定依赖项“选择”任何内容。

是否将 boost 作为静态库或 DLL 链接取决于您在以下位置指定的 .lib 文件(libboostXXX 或 boostXXX):Linker -> Input -> Additional Dependencies。此外,您可能需要访问Linker -> General -> Additional Library Directories并添加您的 boost/libs 文件夹(可能还有其子文件夹)的路径,这样您就不必为要添加的每个库指定完整路径依赖关系。

但是,您应该始终(尤其是在使用静态库时)链接到使用您在主项目中选择的相同运行时构建的库。如果您尝试混合不同的运行时,您很可能会收到关于双重定义符号(在系统库中)等的非常神秘的链接器错误。在最坏的情况下(通常是由于某些不太明显的设置不匹配,例如更改 STL 选项的预处理器定义),它不会导致链接器失败,而是会导致神秘的运行时崩溃。然而,Visual Studio 2010 及更高版本在检测此类不匹配方面做得非常好(与以前的 VS 版本相比)。

另一个问题可能是某些 boost 标头使用#pragma 注释来强制通过特定名称链接必要的库。如果您发现这是一个问题并且想要手动指定您的依赖项(或者如果它选择了您并不真正需要链接到的东西),您可以将全局预处理器定义BOOST_ALL_NO_LIB添加到C/C++ -> Preprocessor -> Preprocessor Definitions

另外,您真的需要项目中的所有boost 库吗?它们有很多,而且大多数都是为了非常特别的东西。根据我的经验,人们通常只需要一小部分提升来实现他们的项目特定目标。要创建这样一个子集,仅包含您真正使用的库的标头及其依赖项,您可以使用BCP 实用程序。这可能会大大减少您的 boost/boost 文件夹。当然,您也可以删除您不打算使用的库的二进制文件。另请注意,boost 中的大多数通用库都是仅头文件,因此根本不需要链接到任何库。

于 2013-06-08T07:33:03.813 回答