0

我编写了一个 Tcl 脚本,它使用 TclMagick 扩展和 GraphicsMagick。

对于 GraphicsMagick,我有 Windows DLL 和 Linux SO 文件。我希望能够制作两个与这些库捆绑在一起的 Starkit/Starpack 应用程序:一个用于 Windows(带有 DLL),一个用于 Linux(带有 SO 文件)。

这合理吗?可以做到吗?

编辑

我似乎无法在 Windows 下使用具有依赖关系的 DLL。就我而言,我想使用 TclMagick 扩展,但它需要 GraphicsMagick 的 DLL,而 starkit 找不到这些。在这种情况下我该怎么办?

4

2 回答 2

2

是的。在 的lib/tclmagick子目录中$starkit::topdir,您将放置动态库和作为该库的适当pkgIndex.tcl文件load。使用 Makefile 或其他构建脚本来使用正确的动态库文件,并根据目标平台生成 pkgIndex。

目录层次结构:

appname.vfs/
    main.tcl
    lib/
        app-appname/
            appname.tcl
            pkgIndex.tcl
        tclmagick/
            pkgIndex.tcl
            tclMagick.so

package require tclmagick对于“tclmagick”的某些大写字母,将按您的预期工作

于 2013-07-11T10:07:46.240 回答
1

你可以做到,但你可能需要一些额外的 Windows 技巧才能让事情正常工作。

Windows 有很多加载依赖库的选项,此页面解释了基础知识:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx

有一个部分可以帮助您:

如果内存中已经加载了具有相同模块名称的 DLL,则系统在解析到加载的 DLL 之前只检查重定向和清单,无论它位于哪个目录。系统不会搜索 DLL。

因此,为了获得正确的依赖关系,您可以首先将依赖库加载到内存中(遗憾的是您不能load为此使用,但可以使用 twapi 中的某些内容,例如twapi::load_libary(参见http://wiki.tcl.tk/9886)来获取从某个临时位置加载的库)。

遗憾的是,大多数操作系统没有提供一种简单或可移植的方式来直接从内存加载动态库,因此您需要先将依赖库复制到临时位置(您可以通过适当的黑客或使用类似可安装文件系统的东西来完成Windows/FUSE 在 Linux 上)。

在大多数情况下,最简单的方法是将所有依赖项静态链接到扩展中。

于 2013-07-17T23:27:25.270 回答