【发布时间】:2016-12-01 17:38:02
【问题描述】:
我正在尝试向 Visual Studio 2013 添加一个项目,该项目将在 Visual Studio GUI 中构建 OpenSSL。我使用“makefile”项目设置作为起点。
我已经成功地在 Visual Studio 命令行窗口上构建了 OpenSSL,并且它可以工作。但是,当我尝试使用在命令行中使用的完全相同的命令通过项目构建 OpenSSL 时,出现链接错误 (LNK2001)。
使用 dumpbin 查看生成的 .lib 文件,我看到当我通过 GUI 构建 OpenSSL 时,下划线 ('_') 会附加到所有导出(因此称为 BIO_read 的函数将变为 @987654324 @)。
微软对 LNK2001 有这样的说法:https://msdn.microsoft.com/en-us/library/f6xx1b1z.aspx?f=255&MSPPError=-2147217396
具体来说:
当一个符号未解析时,您可以通过以下准则获取有关该函数的信息:
在 x86 平台上,用 C 编译的名称或 C++ 中的外部“C”名称的调用约定修饰是:
__cdecl
函数有一个下划线 (_) 前缀。
我认为 cl 的调用参数略有不同,这使得它发出下划线前缀,但我无法弄清楚到底有什么不同 - 命令行没有不同,如果环境变量存在差异,我可以'找不到相关的。
有什么想法吗?
【问题讨论】:
-
当您运行 Visual Studio 时,您实际上可以在构建日志中看到它传递给链接器的 actual 标志和参数。你是说如果你在命令行中做同样的事情,你会得到不同的输出吗?如果是这样,请检查环境设置、路径等方面的差异。
-
@MartinBonner ,是的,我已经在构建日志中查看了传递给 cl.exe 的构建标志(我也可以在 .obj 文件中看到下划线),但它们没有似乎有所不同。我在项目命令的开头运行了“set”,但结果似乎没有我知道会影响 CL 的东西。
-
下划线被添加到函数名之前,因为它是一个前缀。您是否在项目文件中包含任何必要的库?
-
您仍然需要运行 OpenSSL 的
Configure脚本来生成关键文件,例如opensslconf.h和bn.h。该脚本还修复了稍后组装的 ASM 模板 如果 您配置 withoutno-asm。另请参阅Build Multiarch OpenSSL on OS X,它讨论了 OS X 和 iOS 上的胖库上下文中的文件。 -
@1201ProgramAlarm 我做了,否则当我从命令行构建库时它不会工作。
标签: c++ c windows visual-studio openssl