我为名为 Orbiter 的太空飞行模拟器开发插件:http: //orbit.medphys.ucl.ac.uk/
它接受插件作为 dll 文件。我最近制作了一个插件,它也使用了 Bullet 物理库。它静态链接到 dll,因此子弹库本身不是 dll,而是直接编译到插件中。Bullet 使用用于发布的多线程 (/MT) 选项和用于调试的多线程调试 (/MTd) 选项进行编译
现在我想使用来自 Boost 的线程。所以我通过从 Boost Pro 安装程序中选择 2 个静态选项来安装静态 Boost 库。我能够使用这些静态库成功创建一个 Win 32 应用程序。该应用程序也使用了多线程 (/MT)。所以我知道标志上没有不匹配。
然而,当我将 Boost 添加到也有 Bullet 的 Orbiter dll 插件项目时,我收到一个链接错误:
1>----- 构建开始:项目:Bump,配置:发布 Win32 ------
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(990,5): 警告 MSB8012: TargetPath(F:\Orbiter\Orbitersdk\samples\BumpThreaded\Release\ Bump.dll) 与链接器的 OutputFile 属性值 (F:\Orbiter\Modules\Plugin\Bump.dll) 不匹配。这可能会导致您的项目构建不正确。要更正此问题,请确保 $(OutDir)、$(TargetName) 和 $(TargetExt) 属性值与 %(Link.OutputFile) 中指定的值匹配。
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMT.lib(typinfo .obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已在 LIBCMT 中定义.lib(typinfo.obj) 1> 创建库 F:\Orbiter\Orbitersdk\samples\BumpThreaded\Release\Bump.lib 和对象 F:\Orbiter\Orbitersdk\samples\BumpThreaded\Release\Bump.exp
1>LINK : 警告 LNK4098: defaultlib 'MSVCRT' 与其他库的使用冲突;使用 /NODEFAULTLIB:library 1>......\Modules\Plugin\Bump.dll:致命错误 LNK1169:找到一个或多个多重定义符号
========== 构建:0 成功,1 失败,3 最新,0 跳过 ==========
从我读到的其他问题来看,这可能是由于在应用程序中使用的 2 个库的标志不匹配。但这里不是这样。Bullet 和 Boost 都使用 /MT 编译。
boost 也适用于普通的 win 32 应用程序,那么为什么在静态链接它以输出 dll 时出现问题?
我使用 Visual Studio 2010 Express 并拥有 Windows 7 64 位系统。
提前感谢您的帮助:)