在MS Visual C ++ 2010中
我的解决方案中有一个C ++项目,它使用了boost并且运行得很好。
然后我决定将此项目转换为静态库并创建一个依赖于此静态库的新项目。
现在,我转换的静态库构建没有错误和警告(编译器和链接器) 但是新项目编译但没有链接。
我得到了:
1>LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc100-mt-1_45.lib'
作为测试,我为此库添加了链接器选项的完整目录路径...然后它抱怨
1>LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-1_45.lib'
我现在已经添加了所有库的完整路径,现在它已构建并运行。
我对此解决方案不满意,因为:
我知道答案是创建一个DLL,但是有办法静态地执行此操作并保持链接在我的静态库级别。
修改
如果我告诉.exe链接器明确忽略boost libs那么一切都没问题,除了.exe根本不用担心boost。
/NODEFAULTLIB:"libboost_thread-vc100-mt-1_45.lib" /NODEFAULTLIB:"libboost_date_time-vc100-mt-1_45.lib"
答案 0 :(得分:24)
显然你不需要.libs,因为你的exe也没有它们。您似乎只使用boost header-only方法和类。因此,只需通过在项目中定义预处理程序符号BOOST_ALL_NO_LIB来告诉boost禁用自动链接。
如果你想通过包含所有提升来使你的.lib变得不必要,那么这个问题似乎得到了答案(我从未真正尝试过):Linking static libraries to other static libraries
答案 1 :(得分:4)
构建库时,可以在其中包含boost库。为此,在VisualStudio的Librarian > General
属性页中,将您的boost库列为Additional Dependencies
。
但是,如果您的客户自己使用boost,并且静态链接到它(特别是与您使用的版本不同的版本),则可能会出现问题。
答案 2 :(得分:1)
你是否构建了boost库? Boost中有一些需要编译的库。如果您还没有这样做,请参阅“Getting started in Windows”了解如何构建Boost库。
EDIT-1: Boost可以构建为静态和动态可加载(dll)库。
EDIT-2:如果您已经构建了Boost,那么@Daniel Gehriger的答案将告诉您如何在VS中添加它。