Como faço para gerar uma biblioteca de importação para um exe usando automake/autoconf/libtool?
Pergunta
Estou portando um aplicativo Linux com plug-ins para Windows usando mingw-w64.Gostaria de gerar uma biblioteca de importação para o exe do aplicativo principal e vincular as DLLs do plug-in a essa biblioteca de importação para que os plug-ins possam usar símbolos do exe.Isso me permitirá carregar DLLs no Windows usando a interface dlopen em win32-dlfcn.
O que não tenho certeza de como fazer é escrever regras autoconf, automake ou libtool para fazer isso.Alguém sabe como escrever essas regras ou conhece outro projeto onde essas regras são implementadas?
Solução
Parece que a melhor maneira é agir pelas costas da libtool.Aqui estão alguns trechos do meu Makefile.am.
Incluir condicionalmente o dlfcn.c
fonte.Você também terá que atualizar o caminho de inclusão e possivelmente colocar alguns extern "C"
guardas no arquivo de cabeçalho.
if HOST_MINGW32
bali_phy_SOURCES += dlfcn-win32/dlfcn.c
endif
Você precisará ajustar os LDFLAGS do aplicativo principal para que uma biblioteca de importação seja gerada como subproduto da compilação:
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
Para compilar o plugin, passe flags diretamente para o vinculador para evitar explicar a biblioteca de importação para libtool.Você também terá que adicionar o diretório que contém seu aplicativo principal (aqui está $(top_builddir)
) para o caminho de pesquisa do vinculador.
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)
O _DEPENDENCIES
line faz com que o módulo dependa do aplicativo principal, de modo que o aplicativo principal e sua biblioteca de importação sejam construídos primeiro.