看来最好的办法是背着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 行使模块依赖于主应用程序,从而首先构建主应用程序及其导入库。