【问题标题】:How do I generate an import lib for an exe using automake/autoconf/libtool?如何使用 automake/autoconf/libtool 为 exe 生成导入库?
【发布时间】:2013-11-15 18:21:35
【问题描述】:

我正在使用 mingw-w64 将带有插件的 Linux 应用程序移植到 Windows。我想为主应用​​程序 exe 生成一个导入库,并将插件 DLL 链接到这个导入库,以便插件可以使用 exe 中的符号。这将允许我使用 win32-dl​​fcn 中的 dlopen 接口在 Windows 上加载 DLL。

我不确定如何编写 autoconf、automake 或 libtool 规则来完成此任务。有谁知道如何编写这样的规则,或者知道实施这些规则的另一个项目?

【问题讨论】:

    标签: plugins dll mingw libtool


    【解决方案1】:

    看来最好的办法是背着libtool。以下是我的 Makefile.am 中的一些摘录。

    有条件地包含dlfcn.c 源。您还必须更新包含路径,并可能在头文件中放置一些 extern "C" 保护。

    if HOST_MINGW32
    bali_phy_SOURCES += dlfcn-win32/dlfcn.c
    endif
    

    您需要调整主应用程序的 LDFLAGS,以便生成导入库作为编译的副产品:

    if HOST_LINUX
    bali_phy_LDFLAGS = -rdynamic
    else
    if HOST_MINGW32
    bali_phy_LDFLAGS = -Wl,--export-all-symbols,--out-implib=libbali-phy.dll.a
    else
    bali_phy_LDFLAGS =
    endif
    endif
    

    要编译插件,请将标志直接传递给链接器,以避免向 libtool 解释导入库。您还必须将包含主应用程序的目录(此处为 $(top_builddir))添加到链接器搜索路径。

    if HOST_MINGW32
    EXTRADEPENDENCIES = bali-phy.exe
    EXTRALDFLAGS = -L$(top_builddir) -Wl,libbali-phy.dll.a
    else
    EXTRADEPENDENCIES =
    EXTRALDFLAGS =
    endif
    
    mod_la_SOURCES = computation/builtins/mod.C
    mod_la_LDFLAGS = -module -shared -avoid-version -export-dynamic -no-undefined -enable-runtime-pseudo-reloc $(EXTRALDFLAGS)
    mod_la_DEPENDENCIES = $(EXTRADEPENDENCIES)
    

    _DEPENDENCIES 行使模块依赖于主应用程序,从而首先构建主应用程序及其导入库。

    【讨论】:

    • FTR,如果你使用libtool,你也可以使用libltdl来加载模块。此外,相同的--out-implib 方法也适用于加载插件的库,而插件又使用该库中的函数。如果在 github.com/ndim/ndim-portability-test 上放置了 library-with-plugins 的概念验证实现,它解决了我过去一直遇到的链接问题(直到我读到这个答案)。
    猜你喜欢
    • 2014-08-05
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多