automake Mingw 交叉编译链接到已安装静态库的共享库的问题

A problem with automake Mingw cross-compiling of a shared library linked to an installed static library

我正在构建一个测试 hello-world 可执行模块 linking 到一个简单的共享对象库 'libshared',然后 links 到一个静态库 'libsodium' 是在 'depends' 目录中构建的。 OS 是 Ubuntu 16.04.6 LTS。

当我为 Linux 构建这个时,构建没问题。 当我为 Mingw 构建此库时,会打印此 libtool 错误消息:

*** Warning: This system cannot link to static lib archive /home/ubuntu/repo/test-dll/depends/x86_64-w64-mingw32/share/../lib/libsodium.la.
*** I have the capability to make that library automatically link in when
*** you link to this library.  But I can only do this if you have a
*** shared version of the library, which you do not appear to have.

目标 'libshared.la' 的配方失败。

Makefile.am:

.PHONY: gen
.INTERMEDIATE: $

# shared lib
lib_LTLIBRARIES = libshared.la
libshared_la_SOURCES = \
    src/example_dll.c
libshared_la_CPPFLAGS = -I$(top_srcdir)/src -I /src
libshared_la_CFLAGS = -DBUILDING_EXAMPLE_DLL -O2  -Wno-unused-parameter
libshared_la_LDFLAGS = -no-undefined
libshared_la_LIBADD = -lsodium
#libshared_la_LIBADD = $(prefix)/lib/libsodium.la

# executable
inst_PROGRAMS = testexe
instdir=$(prefix)/bin
testexe_SOURCES = \
     src/example_exe.c
testexe_CFLAGS = -DBUILDING_EXAMPLE_DLL -O2  -Wno-unused-parameter
testexe_CPPFLAGS = -I$(top_srcdir)/src
testexe_LDADD = libshared.la

我如何调用 configure 和 make (build_win.sh):

export HOST=x86_64-w64-mingw32
CXX=x86_64-w64-mingw32-g++-posix
CC=x86_64-w64-mingw32-gcc-posix
PREFIX="$(pwd)/depends/$HOST"

set -eu -o pipefail
set -x

cd depends/ && make HOST=$HOST V=1 NO_QT=1
cd ../

./autogen.sh
CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix="${PREFIX}" --host=x86_64-w64-mingw32
CC="${CC} -g " CXX="${CXX} -g " make V=1

configure.ac 参数很简单


我设法构建它的唯一方法是,如果我手动将 libsodium.la 移动到分发的根目录中,将 'libsodium.a' 移动到 '.libs' 子目录中并手动更正 libsodium.la参数 'libdir to ''(原为 '/home/ubuntu/repo/test-dll/depends/x86_64-w64-mingw32/share/../lib/libsodium.a')和 'installed' 至 'no'(原为 'yes')。

所以我的问题是:

当它位于 'depends' 目录并设置为 'installed=yes' 时,为什么它试图 link libsodium 作为共享库(我需要 link 它作为静态)?

我可以为 MINGW 设置正确的 automake 设置以 link 我的共享库到 'depends' 目录中的静态库吗?

刚刚找到一个解决方案(或变通方法)如何在 Mingw 上制作这个 link(并生成 dll):

而不是导致 libtool 搜索 libsodium 共享库的 libshared_la_LIBADD = -lsodium,我只是将选项 -Wl,-lsodium 传递给 libshared_la_CFLAGS 中的 linker。