1

我正在尝试测试一些可boost::filesystem用于各种事物的代码。
我为 vc11 构建了 boost 1.51 的静态版本,预期的库按预期出来了。

这是我使用的标志:
b2 --with-filesystem --build-type=complete --build-dir=.\build link=static runtime-link=static

这是它生成的文件列表:

libboost_filesystem-vc110-mt-s-1_51.lib
libboost_filesystem-vc110-mt-sgd-1_51.lib
libboost_filesystem-vc110-s-1_51.lib
libboost_filesystem-vc110-sgd-1_51.lib
libboost_system-vc110-mt-s-1_51.lib
libboost_system-vc110-mt-sgd-1_51.lib
libboost_system-vc110-s-1_51.lib
libboost_system-vc110-sgd-1_51.lib


然后我创建了一个新的Win32 DLL项目并添加了正确的 include/lib 目录。
但是当我尝试编译时,我得到以下输出:

LNK1104: cannot open file 'libboost_filesystem-vc110-mt-gd-1_51.lib

但是这个文件不存在,因为(afaik)它不是库的静态版本......
这很奇怪,因为我从来没有要求在我的项目中的任何地方链接到 DLL 版本!

那么为什么我的项目抱怨我从未要求使用的库呢?
boost headers 是否会自动尝试链接到它们相应的库?
我应该设置某种预处理器标志来告诉boost我想使用静态的单线程版本boost::filesystem吗?

更新:

我在评论中被告知 boost实际上会尝试自动链接支持它的编译器,通过<boost/config/auto_link.hpp>...
在几次尝试正确配置这些头文件以使用 boost 的静态、/MDd(调试)和/MD(发布)版本之后,我仍然收到此错误。

因此,如果有人能告诉我如何正确配置禁用此功能,我会将其标记为答案。
另外,我是否正确假设libboost_filesystem-vc110-s-1_51.lib并且libboost_filesystem-vc110-sgd-1_51.lib是正确的/MD/MDd库?

谢谢!

4

1 回答 1

2

要禁用自动链接,您需要定义BOOST_ALL_NO_LIB. 从升压文档:

// BOOST_ALL_NO_LIB: Tells the config system not to automatically select 
// which libraries to link against.  
// Normally if a compiler supports #pragma lib, then the correct library 
// build variant will be automatically selected and linked against, 
// simply by the act of including one of that library's headers.  
// This macro turns that feature off.

但不要那样做——它不会解决你的问题。自动链接通常是正确的,即你要么链接到错误的库,要么你错误地配置了你的预处理器宏。如果链接器想要链接到共享库,我猜你定义了BOOST_ALL_DYN_LINKorBOOST_FILE_SYSTEM_DYN_LINKBOOST_SYSTEM_DYN_LINK. 删除它,它应该链接得很好。

于 2013-06-06T13:18:48.620 回答