针对自定义构建的 tcl85.lib 的链接器错误,针对 ActiveState 发行版的 tcl85.lib
Posted
技术标签:
【中文标题】针对自定义构建的 tcl85.lib 的链接器错误,针对 ActiveState 发行版的 tcl85.lib【英文标题】:Linker errors against custom built tcl85.lib, works against ActiveState distribution's tcl85.lib 【发布时间】:2014-01-20 04:30:33 【问题描述】:我们正在自己构建 Tcl,以便将我们自己编译的二进制文件与应用程序一起分发。应用程序本身链接到 Tcl 库并在内部使用 API。
为了构建 Tcl,我们从 http://sourceforge.net/projects/tcl/ 获取源代码,然后导航到 /win 目录,将 buildall.vc.bat 文件更改为指向我们的 MSVC 安装,然后运行该 bat 文件。构建按预期工作,输出在 /win/Release_VC11 中生成。更具体地说,生成了 tcl85.lib 和 tcl85.dll。
当我们从 Qt C++ 应用程序中链接到这个 .lib 时,我们会得到一堆链接器错误。例如:
commands.obj : error LNK2019: unresolved external symbol __imp_Tcl_AppendResult
referenced in function "int __cdecl CallQMessageBox(void *,struct Tcl_Interp *,
int,char * * const)" (?CallQMessageBox@@YAHPEAXPEAUTcl_Interp@@HQEAPEAD@Z)
但是,当我们链接作为 ActiveState Tcl 分发的一部分提供的 tcl85.lib 文件时,链接器没有任何问题并且构建良好。我们验证了它在两种情况下都是完全相同的 Tcl 版本。
我们正在使用 MSVC 2012 (Express Edition) 构建 Tcl,构建命令在 buildall.vc.bat 中保持不变:
::set OPTS=threads
if not %SYMBOLS%.==. set OPTS=symbols
nmake -nologo -f makefile.vc release OPTS=%OPTS% %1
我们一直在尝试各种事情,但都没有运气。
【问题讨论】:
看起来与链接库有关的不同选项,这不是我非常了解的(我在不同平台上工作)。 只是一个想法:您是针对 ActiveTcl 库还是根据源代码制作的库进行编译? IIRC,你应该链接到你编译的那些… 【参考方案1】:好的,想通了:
我将 Tcl 构建为 32 位二进制而不是 64 位。
替换
call "D:\tools\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat"
与
call "D:\tools\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat"
并像这样将 AMD64 添加到 nmake 命令中
nmake -nologo -f makefile.vc release OPTS=%OPTS% %1 MACHINE=AMD64
在 buildall.vc.bat 中似乎已修复它。
【讨论】:
哦,32bit/64bit 肯定可以的。以上是关于针对自定义构建的 tcl85.lib 的链接器错误,针对 ActiveState 发行版的 tcl85.lib的主要内容,如果未能解决你的问题,请参考以下文章
构建一个最小的 Qt 控制台项目失败,出现一个神秘的链接器错误 LNK2001: Unresolved external Symbol