2016-12-01 89 views
1

我试图将项目添加到Visual Studio 2013中,该工程将在Visual Studio GUI中构建OpenSSL。我使用“makefile”项目设置作为起点。Visual Studio使用下划线前缀将OpenSSL构建为符号

我已经成功地在Visual Studio命令行窗口上构建OpenSSL,并且它可以工作。但是,当我尝试使用命令行中使用的完全相同的命令通过项目构建OpenSSL时,出现链接错误(LNK2001)。

使用dumpbin查看生成的.lib文件,我发现当我通过GUI构建OpenSSL时,下划线('_')被附加到所有导出(因此称为BIO_read的函数将变为_BIO_read)。

微软这样说LNK2001:https://msdn.microsoft.com/en-us/library/f6xx1b1z.aspx?f=255&MSPPError=-2147217396

具体来说,它说:

当一个符号是未解决的,您可以通过以下原则得到有关功能的信息在x86平台上,对于以C编译的名称或C++中的extern“C”名称的调用约定装饰是:

__cdecl

函数带有下划线(_)前缀。

我认为CL被称为略有不同的参数,这使得它发出下划线的前缀,但我无法弄清楚究竟是不同的 - 在命令行中没有不同,如果有在环境的差异变量我找不到相关的变量。

任何想法这里发生了什么?

+1

当您运行Visual Studio时,您实际上可以在构建日志中看到它传递给链接器的* actual *标志和参数。你是说如果你在命令行中做同样的事情,你会得到不同的输出结果吗?如果是这样,请检查环境设置,路径等方面的差异。 –

+0

@MartinBonner,是的,我已经看过构建日志中传递给cl.exe的构建标志(我可以看到.obj中的下划线文件也是),而且它们看起来并没有什么不同。我在项目命令的开头运行了“set”,但结果似乎没有我知道会影响CL的内容。 – nitzanms

+0

下划线由函数名称前缀,因为它是前缀。你有没有在你的项目文件中包含任何必要的库? – 1201ProgramAlarm

回答

0

通过批处理文件运行构建并从项目属性中的Preprocessor Definitions字段中删除$(NMakePreprocessorDefinitions),使我可以成功构建OpenSSL,而不会产生下划线前缀。

相关问题