我正在用VS 2012开发一个动态库(.dll)和x64模式的C++/CLI项目。
如果我切换到静态库模式,我会得到下面的错误。
LIBPATH环境变量C:\Depot\Main\Current\Sln\ALibraryProject\Stdafx.cpp 1 ALibraryProject,请使用LIBPATH环境变量C1107 1 ALibraryProject指定程序集搜索路径
我尝试删除对mscorlib.dll的引用,然后将其再次添加到:
项目>属性>一般>公共属性
但这没什么用。因为我知道VS处理对.NET程序集的引用,我不想向它添加磁盘文件引用,因为它看起来不合逻辑!以前有人面对过这个吗?
发布于 2013-04-21 20:16:31
如果我将模式切换到静态库
当您尝试使用/clr构建静态库时,这并不是典型的错误。我必须假设您一直在修改项目设置,以消除在尝试这样做时遇到的无法理解的链接器错误。
核心问题是C++/CLI构建系统不支持包含MSIL的静态库。托管代码不使用链接器,绑定发生在运行时。这使得静态库和DLL之间的本质区别消失了。所以微软决定不支持它,因为它没有多大的意义来实现它。不幸的是,当你试图这么做的时候,他们没有大声喊叫,你得到的链接器错误没有给出足够的提示你做错了什么。解决方法,比如与ILMerge合并也不起作用,它不能处理混合模式的程序集。合并本机代码部分及其关联的重定位表条目非常重要。
请记住,链接本机静态库是很好的。典型的C++/CLI项目只有需要使用/clr构建的ref类包装器。可以将库中的任何数量的本机代码粘合到最终程序集中。
我不得不对实际的编译错误进行理论分析,太多的程序员得到这个错误的另一个原因与构建静态库无关,他们在评论中骚扰我。
请注意,针对与您安装在计算机上的版本不同的.NET是一件相当危险的事情,特别是如果您想要目标为4.0,并且安装了4.5.x。.vcxproj文件中的关键元素是<TargetFrameworkVersion>。如果您启动针对旧.NET版本的项目,您必须自己插入它,这将是缺失的。IDE也不支持在它存在的情况下更改它,同样是手工编辑。
这足以引导MSBuild生成正确的编译命令。您可以验证这个平移是否正常,请查看项目Debug目录的*.tlog子目录。1.tlog文件显示了传递给编译器的选项。它应包括:
/AI"C:\Program (x86)\Reference /AI /FU"C:\Program (x86)\Reference /FU
注意子目录,非常重要的是它与预期的.NET目标相匹配。本例中的v4.0。而且非常非常重要的一点是,它不能指向c:\windows\microsoft.net,这是引用程序集的遗留位置。
发布于 2014-08-28 17:21:34
在将解决方案从VS2010编译器转换为VS2013编译器时,我也遇到了同样的问题。
我通过更改项目设置(对于包含抛出此错误的托管.cpp文件的项目)来解决此问题,具体如下:在project中,使用目录添加了C/ C/C++ General附加#,并添加了宏$(FrameworkPathOverride).这将解析为您要针对的.NET版本的引用程序集目录,在我的示例中是C:\Program (x86)\Reference .NET
发布于 2013-06-18 01:33:43
我也有同样的问题。拥有dll不起作用,因为我需要为一个C++对象提供一个本机.net包装器,以便它能够实现一个本地的c++接口--我不能在dll接口中使用.net --这就产生了编译错误
在VS 2010 (与.net 4一起使用)中,这是一个静态库。
我的一些可执行文件和dll也有一些/clr代码。他们没有问题。我不是想做一个网络混血儿。
https://stackoverflow.com/questions/16135490
复制相似问题