0

我曾尝试使用 VS2017 在 Win10 64 位上编译 OpenCascade。我在 64bit 上编译,但遇到链接错误,其中之一是:

1>------ Build started: Project: TKDraw, Configuration: Debug x64 ------
1>LINK : fatal error LNK1104: cannot open file 'tcl86.lib'
========== Build: 0 succeeded, 9 failed, 50 up-to-date, 1 skipped ==========

我注意到在 TKDraw 项目中,我有以下链接设置文件/路径:

..\..\win64\vc14\libd\TKMesh.lib
..\..\win64\vc14\libd\TKService.lib
..\..\win64\vc14\libd\TKHLR.lib
C:\ActiveTcl\lib\tcl86t.lib
C:\ActiveTcl\lib\tk86t.lib
gdi32.lib
advapi32.lib
user32.lib
shell32.lib
..\..\win64\vc14\libd\TKShHealing.lib
opengl32.lib
windowscodecs.lib
C:\Program Files\freetype\lib\freetyped.lib
winmm.lib
..\..\win64\vc14\libd\TKTopAlgo.lib
..\..\win64\vc14\libd\TKGeomAlgo.lib
..\..\win64\vc14\libd\TKBRep.lib
..\..\win64\vc14\libd\TKGeomBase.lib
..\..\win64\vc14\libd\TKG3d.lib
..\..\win64\vc14\libd\TKG2d.lib
..\..\win64\vc14\libd\TKMath.lib
..\..\win64\vc14\libd\TKernel.lib

如您所见,他们都没有告诉我关于tcl86.lib的信息,但是编译器说这个 lib 丢失了。为什么 ?此外,我在opencascade文件夹中没有找到任何tcl86.lib,那么,为什么要问我这个文件呢?你能帮我一点吗?

4

3 回答 3

2

您可以在此处下载 Open CASCADE 的第 3 方库:https ://old.opencascade.com/content/3rd-party-components

如果您将所有 3rd 方库放在一个目录中,您可以在构建中声明其位置,CMake构建将自动使用它们。

于 2020-12-30T12:42:57.970 回答
1

我在尝试使用 MSVC 从源代码编译 SQLite 时遇到了同样的错误。我在源代码中没有看到任何#pragma引用tcl86.lib。但是,我复制tcl86.lib到 Tcl 目录中,并将其重命名为tcl86t.lib. 它似乎工作。

在 SQLitecrash8-1.2 test中,我收到错误:

testfixture.exe:执行“sqlite3_crashparams”时关闭引号后的额外字符

我希望这只是一个测试问题。

此外,如果 SQLite 源已解压缩的任何目录名称中有空格,则构建过程会出错。

于 2021-01-26T18:01:52.107 回答
1

这是因为 Visual Studio C++ 编译器具有#pragma lib允许直接在 C++ 代码中添加库依赖项的功能,请参阅src/Draw/Draw.cxx

// on MSVC, use #pragma to define name of the Tcl library to link with,
// depending on Tcl version number
#ifdef _MSC_VER
// two helper macros are needed to convert version number macro to string literal
#define STRINGIZE1(a) #a
#define STRINGIZE2(a) STRINGIZE1(a)
#pragma comment (lib, "tcl" STRINGIZE2(TCL_MAJOR_VERSION) STRINGIZE2(TCL_MINOR_VERSION) ".lib")
#pragma comment (lib, "tk"  STRINGIZE2(TCL_MAJOR_VERSION) STRINGIZE2(TCL_MINOR_VERSION) ".lib")
#undef STRINGIZE2
#undef STRINGIZE1
#endif

显然,您的 Tcl/Tk 版本在库文件名中有一个额外的后缀“t” tcl86t.lib,因此链接器无法找到tcl86.lib.

可能的解决方案:

  • 在您的 Tcl 安装中重命名tcl86t.lib-> tcl86.lib(与 tk 相同)。
  • OCCT 源代码中的注释/删除pragma comment。当您使用 CMake 时,似乎所有库都已通过项目设置指定。
  • 从源代码构建 Tcl/Tk 或使用没有名称偏差的预构建二进制文件(例如,由OCCT 项目提供)。
于 2020-12-29T05:18:03.090 回答