因此,我在转换开放源码项目(SQLite)以使用不同的构建系统时遇到了问题,现在我在链接项目时遇到了问题。本质上,我有一个VCProj文件,其定义如下:
<Tool
Name="VCLinkerTool"
AdditionalOptions="/ASSEMBLYRESOURCE:..\System.Data.SQLite\SQLiteCommand.bmp,System.Data.SQLite.SQLiteCommand.bmp
/ASSEMBLYRESOURCE:..\System.Data.SQLite\SQLiteConnection.bmp,System.Data.SQLite.SQLiteConnection.bmp
/ASSEMBLYRESOURCE:..\System.Data.SQLite\SQLiteDataAdapter.bmp,System.Data.SQLite.SQLiteDataAdapter.bmp"
AdditionalDependencies="..\System.Data.SQLite\bin\System.Data.SQLite.netmodule"
OutputFile="..\bin\System.Data.SQLite.DLL"
GenerateManifest="false"
IgnoreDefaultLibraryNames=""
ModuleDefinitionFile="src\sqlite3.def"
EmbedManagedResourceFile=""
DelayLoadDLLs="advapi32.dll"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
ImportLibrary=""
KeyFile="..\System.Data.SQLite\System.Data.SQLite.snk"
CLRUnmanagedCodeCheck="true"
/>由于以下错误,我无法正确链接System.Data.SQLite.netmodule:
连接..。 4>..\System.Data.SQLite\bin\System.Data.SQLite.netmodule :致命错误LNK1302:只支持链接安全.netmodules;无法链接纯.netmodule
System.Data.SQLite.netmodule是从一个C#/.NET项目中生成的。如何强制它使用/clr:safe选项进行编译,因为根据MSDN,这是解决问题的方法。问题是我不知道如何用/clr:safe编译它。我是如何在csproj文件或某个visual中这样做的?如果我试图纠正这个错误,请告诉我一个更好的方法。
更新:所以我已经确定了这个问题,但我不知道为什么是一个问题。因此互操作项目(编译sqlite代码和链接的C项目)使用VCLinkerTool链接到System.Data.SQLite.netmodule。然后有一个C#项目,它使用以下命令创建System.Data.SQLite.netmodule (添加{}中的任何内容以减少长度):
C:\Windows\Microsoft.NET\Framework\v3.5\Csc.exe /noconfig /unsafe- /nowarn:1701,1702 /platform:AnyCPU /errorreport:prompt /doc:..\bin\System.Data.SQLite.XML {DLL REFEERENCFES /debug- /filealign:512 /optimize+ /out:obj\Release\System.Data.SQLite.netmodule {RESOURCES AND CS FILES}
问题在于/platform:AnyCPU。在我的构建中,它是/platform:x86,由于某些原因,这会在链接时引起问题,我不知道为什么,但这是我缩小范围的原因,因为我可以将它更改为AnyCPU,并且它将正确地构建和链接。任何有关这方面的洞察力都将受到赞赏。
发布于 2011-06-23 05:04:52
好的,我终于缩小了问题的范围,也许有人可以把更多的信息传播到为什么,但我对原因有一个粗略的理解。基本上,您不能使用创建的VCLinkerTool链接到.netmodules来获取/platform:x86 (我假设任何其他变量都不是AnyCpu )。我假设这与将混合模式dll与.netmodule链接时在内部进行链接的方式有关。因此,要想使这个项目正常工作,就必须使用C#编译/platorm:AnyCpu项目。
发布于 2011-06-17 21:49:45
这可能是您要寻找的内容:
在Visual中设置此编译器选项
备注
当在“属性页”对话框中启用/clr时,也会根据需要调整与/clr不兼容的编译器选项属性。例如,如果设置了/RTC,然后启用了/clr,则/RTC将被关闭。
此外,在调试/clr应用程序时,请将Debugger Type属性设置为“混合”或“托管”。有关更多信息,请参见C++调试配置的项目设置。
有关如何创建模块的信息,请参阅/NOASSEMBLY (创建一个MSIL模块)。
https://stackoverflow.com/questions/6392179
复制相似问题