Skip to content

Commit b53f2da

Browse files
committed
Always use -Wl,-Bsymbolic flag in shared build
The file m4/ax_check_link_flag.m4 is a copy of https://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html Fix #458 and also fix when building ffms2 as a shared library and link with a static ffmpeg on ubuntu (it was building properly on macOS + windows (msys2)).
1 parent 6379d1a commit b53f2da

2 files changed

Lines changed: 58 additions & 39 deletions

File tree

configure.ac

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -103,53 +103,19 @@ AC_SUBST([FFMPEG_LIBS])
103103
CPPFLAGS="$CPPFLAGS -D__STDC_CONSTANT_MACROS"
104104
CFLAGS="$_CFLAGS $FFMPEG_CFLAGS"
105105

106-
AC_DEFUN([TEST_FFMPEG],
107-
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
108-
#include <libavformat/avformat.h>
109-
#include <libswscale/swscale.h>
110-
]],[[
111-
avformat_network_init();
112-
swscale_version();
113-
]])], [eval $1=yes], [eval $1=no])
114-
])
115-
116-
AC_MSG_CHECKING([whether FFmpeg works])
117-
LIBS="$_LIBS $FFMPEG_LIBS"
118-
TEST_FFMPEG([FFMPEG_WORKS])
119-
AC_MSG_RESULT([$FFMPEG_WORKS])
120-
if test "$FFMPEG_WORKS" = no; then
121-
AC_MSG_FAILURE([cannot link with FFmpeg])
122-
fi
123-
106+
dnl The -Wl,-Bsymbolic flag is required only when building ffms2 as a shared library against a static build of FFmpeg.
107+
dnl Unfortunately, there is no reliable way to detect whether FFmpeg is static at configure time (especially when using *-uninstalled.pc files).
108+
dnl To avoid unexpected link errors, we always enable it when building shared.
109+
dnl For details, see FFmpeg’s advanced linking notes:https://ffmpeg.org/platform.html#Advanced-linking-configuration
124110
src_core_libffms2_la_LDFLAGS=""
125-
AC_MSG_CHECKING([whether -Wl,-Bsymbolic is needed])
126111
if test "$enable_shared" = yes; then
127-
_LDFLAGS="$LDFLAGS"
128-
LDFLAGS="$LDFLAGS -shared $lt_prog_compiler_pic"
129-
TEST_FFMPEG([no_bsymbolic])
130-
if test "$no_bsymbolic" = "no"; then
131-
LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
132-
TEST_FFMPEG([bsymbolic])
133-
if test "$bsymbolic" = "yes"; then
134-
src_core_libffms2_la_LDFLAGS="$src_core_libffms2_la_LDFLAGS -Wl,-Bsymbolic"
135-
else
136-
AC_MSG_RESULT($bsymbolic)
137-
AC_MSG_FAILURE([cannot build ffms2 as a shared library])
138-
fi
139-
else
140-
bsymbolic=no
141-
fi
142-
LDFLAGS="$_LDFLAGS"
143-
src_core_libffms2_la_LDFLAGS="$src_core_libffms2_la_LDFLAGS -version-info $VERSION_INFO"
144-
else
145-
bsymbolic=no
112+
AX_CHECK_LINK_FLAG([-Wl,-Bsymbolic], [src_core_libffms2_la_LDFLAGS="$src_core_libffms2_la_LDFLAGS -Wl,-Bsymbolic -version-info $VERSION_INFO"])
146113
fi
147114
AC_SUBST([src_core_libffms2_la_LDFLAGS])
148115

149116
CFLAGS="$_CFLAGS"
150117
CPPFLAGS="$_CPPFLAGS"
151118
LIBS="$_LIBS"
152-
AC_MSG_RESULT($bsymbolic)
153119

154120
if echo "$host" | $GREP "mingw" >/dev/null 2>&1; then
155121
LTUNDEF="-no-undefined"

m4/ax_check_link_flag.m4

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# ===========================================================================
2+
# https://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html
3+
# ===========================================================================
4+
#
5+
# SYNOPSIS
6+
#
7+
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
8+
#
9+
# DESCRIPTION
10+
#
11+
# Check whether the given FLAG works with the linker or gives an error.
12+
# (Warnings, however, are ignored)
13+
#
14+
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on
15+
# success/failure.
16+
#
17+
# If EXTRA-FLAGS is defined, it is added to the linker's default flags
18+
# when the check is done. The check is thus made with the flags: "LDFLAGS
19+
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
20+
# issue an error when a bad flag is given.
21+
#
22+
# INPUT gives an alternative input source to AC_LINK_IFELSE.
23+
#
24+
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
25+
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
26+
#
27+
# LICENSE
28+
#
29+
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
30+
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>
31+
#
32+
# Copying and distribution of this file, with or without modification, are
33+
# permitted in any medium without royalty provided the copyright notice
34+
# and this notice are preserved. This file is offered as-is, without any
35+
# warranty.
36+
37+
#serial 6
38+
39+
AC_DEFUN([AX_CHECK_LINK_FLAG],
40+
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
41+
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
42+
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
43+
ax_check_save_flags=$LDFLAGS
44+
LDFLAGS="$LDFLAGS $4 $1"
45+
AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
46+
[AS_VAR_SET(CACHEVAR,[yes])],
47+
[AS_VAR_SET(CACHEVAR,[no])])
48+
LDFLAGS=$ax_check_save_flags])
49+
AS_VAR_IF(CACHEVAR,yes,
50+
[m4_default([$2], :)],
51+
[m4_default([$3], :)])
52+
AS_VAR_POPDEF([CACHEVAR])dnl
53+
])dnl AX_CHECK_LINK_FLAGS

0 commit comments

Comments
 (0)