xdimy
xdimy

Reputation: 46

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

I am building a test hello-world executable module linking to a simple shared object library 'libshared' which, in turn, links to a static library 'libsodium' that was built in the 'depends' directory. OS is Ubuntu 16.04.6 LTS.

When I build this for Linux the build is okay. When I build this for Mingw this libtool error message is printed:

*** 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.

and recipe for target 'libshared.la' failed.

The 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

How I invoke configure and 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 params is trivial


The only way I managed to build it was if I manually moved libsodium.la into the root of the distribution and 'libsodium.a' in the '.libs' subdirectory and manually corrected libsodium.la parameters 'libdir to '' (was '/home/ubuntu/repo/test-dll/depends/x86_64-w64-mingw32/share/../lib/libsodium.a') and 'installed' to 'no' (was 'yes').

So my questions are:

Why is it trying to link libsodium as a shared library when it is in 'depends' directory and set as 'installed=yes' (I need to link it as static)?

Could I have correct automake settings for MINGW to link my shared library to static libs in 'depends' directory?

Upvotes: 0

Views: 536

Answers (1)

xdimy
xdimy

Reputation: 46

Just found a solution (or workaround) how to make this link on Mingw (and produce dll):

instead of libshared_la_LIBADD = -lsodium that causes libtool to search for the libsodium shared library, I just passed an option -Wl,-lsodium to the linker in libshared_la_CFLAGS.

Upvotes: 1

Related Questions