我正在尝试使用MSVC 2010而不是GCC构建我的应用程序。 GCC一切正常。我的应用程序使用boost_system和boost_thread库。 我在“系统”布局中使用VC2010构建了boost,这意味着库只被命名为libboost_system.lib(而不是libboost_system_compiler_threading_version_wtf_snafu.lib) libs驻留在C:\ Boost \ lib中, Makefile指定
LFLAGS = /NOLOGO /INCREMENTAL:NO /SUBSYSTEM:CONSOLE
LIBS = /LIBPATH:C:/Boost/lib libboost_system.lib libboost_thread.lib Ws2_32.lib
在调用nmake时会编译,但在尝试链接时会退出
LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-1_43.lib
我认真地说,WTF?我告诉它链接libboost_systen.lib和libboost_thread.lib它是如何尝试链接libboost_data_time的,为什么它假设我在“标记”布局中构建了lib? 我怎样才能阻止MSVC变得聪明并猜测我可能想要链接的内容?
谢谢, 菲利普
答案 0 :(得分:5)
这是Boost libs的一个功能,它具有兼容的自动链接编译器。
(那些错综复杂的库名称涵盖了平台上可用的无数线程和链接选项;在Windows上使用该约定的理由很充分......)
此处提供更多信息:
http://www.boost.org/doc/libs/1_33_1/more/getting_started.html#auto-link
我找不到更新版本的页面,但我相信BOOST_ALL_NO_LIB和相关选项在1.43中仍然有效。
答案 1 :(得分:1)
假设您是自动链接(即您已定义BOOST_ALL_DYN_LINK或库特定的等效项)。
对于布局'系统'你必须定义预处理器宏:
BOOST_AUTO_LINK_NOMANGLE
链接到正确的库名称。
对于布局'已标记'你必须定义预处理器宏:
BOOST_AUTO_LINK_TAGGED
链接到正确的库名称。
我不知道你是否可以对某些库进行覆盖,并保留其他库的默认值。这将是一个我想象的非常麻烦的设置。