1

http://community.activestate.com/node/7011

这有点像链接中那个可怜的 chap shang (我可以使用不分性别的 chap 吗?),除了又是一年,我有 MSVS 2012。

细节

CMake 已将 C:...\Tcl\lib\tcl85.lib 放在我的二进制文件的依赖项列表中(我签入了生成的 .vcproj 文件 - 它在那里)。然而,链接器错误很多,形式如下:

nativeTCL_wrap.obj:错误 LNK2019:未解析的外部符号 __imp__Tcl_ [some-command-name]在函数 _SWIG_Tcl_ [some-other-command- name] 中引用。

因此,我在 MSVS 中检查了我的项目的依赖项列表中列出的头文件:版本#define为 8.5。这与我试图链接到的库相匹配。我尝试使用dependency walker 探索tcl85.lib。显然它无法探索那种文件。我在上面运行了dumpbin.exe ...并且.lib文件具有所有缺失的功能,但格式如下:

__imp_Tcl_ [一些命令名称]

它有所有的符号......但是每个符号都缺少一个下划线!

然后我研究了在 Cygwin 中使用的 ActiveState 的 Tcl 发行版提供的 libtcl85.dll.a 文件,符号如下所示:

__imp__Tcl_ [一些命令名]

所以它额外的下划线,并且二进制链接在 Cygwin 上正确。

...

这真的是我举起双手思考“做什么?”的时刻之一。在其所有简单化的语法上搞砸了荣耀。相同的 swig 接口文件与相同的 CMake 在 Cygwin 中成功生成模块。但是开发 Cygwin 是一件很痛苦的事情,因为它太慢了(构建时间几乎是更多原生 Windows 系统的 5-8 倍)。

接下来发生什么?

我是否试图说服 Swig 使用少一个下划线生成依赖项?如果有怎么办?我会放弃并提交错误报告吗?如果有,在哪里?这是 ActiveState Tcl 中的错误吗?这是 Swig 中的错误吗?这根本不是一个错误,我只是搞砸了?

因为没有下划线,王国就消失了?

4

1 回答 1

1

所以,当我写我的问题时,我开始考虑所有不同的选择来解决这可能会出错的原因。然后我记得 CMake 默认选择 32 位版本的 MSVS。我现在感觉很害羞,但是由于其他人显然在 ActiveState 论坛上遇到了类似的问题,所以我将我的答案留在这里,以供其他需要这个小小的提醒的人使用……

事实证明,选择 64 位版本的 MSVScmake -G "Visual Studio 2012 Win64"修复了所有问题。链接工作正常。二进制文件成功加载到 Tclsh 中。

我希望我的构建工具会提供更全面的错误消息,关于尝试将 32 位和 64 位二进制文​​件链接在一起,不过......

于 2013-06-22T05:30:24.150 回答