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。
我正在构建一个测试 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。