【问题标题】:Linking to tcl85.lib with SWIG via MSVS (autogenerated by CMake)通过 MSVS 使用 SWIG 链接到 tcl85.lib(由 CMake 自动生成)
【发布时间】:2013-06-22 05:22:20
【问题描述】:

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

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

详情

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

nativeTCL_wrap.obj : error LNK2019: unresolved external symbol __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 中的错误吗?这根本不是一个错误,我只是被搞砸了?

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

【问题讨论】:

    标签: visual-studio-2012 tcl swig activestate


    【解决方案1】:

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

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

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

    【讨论】:

    • 当您拥有多种架构时,许多工具会变得更加棘手。很长一段时间以来,这不是 Windows 上的典型问题,因此关于该主题的“社区智慧”相当低,但现在您已经使用了 32 位和 64 位架构(编译器都支持) !)所以丑陋的细节暴露无遗。 (你不能在同一个二进制文件中混合 32 位和 64 位代码——在它们之间调用——而没有超出正常水平的诡计,我们当然不会为这种狂野而烦恼Tcl 的实现...)
    • 我想你不知道下划线是否是一个广泛使用的细节?我可以期望在其他二进制文件中看到它吗?你知道,所以我可能会更早地认识到这种事情,而不是输入一个巨大的详细 SO 问题,只是几分钟后才意识到一些荒谬的愚蠢。 >_
    • @DonalFellows 仍在学习 SO 的工作原理 - 所以,请原谅不合适的名称标记。我也无法编辑我的 cmets...实际消息内容在上一条消息中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    相关资源
    最近更新 更多