On 2017-10-4 03:37 , Daniel J. Luke wrote:
Currently ntp builds on 10.13 fail with:
% make
/Applications/Xcode.app/Contents/Developer/usr/bin/make all-am
CCLD ntptime
Undefined symbols for architecture x86_64:
"_lib_nextbuf", referenced from:
_common_prettydate in libntp.a(prettydate.o)
"_lib_stringbuf", referenced from:
_common_prettydate in libntp.a(prettydate.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [ntptime] Error 1
make: *** [all] Error 2
The libtool invocation is actually:
../libtool --silent --tag=CC --mode=link cc -Wall -Wcast-align -Wcast-qual
-Wmissing-prototypes -Wpointer-arith -Wshadow -Winit-self -Wstrict-overflow
-D_P1003_1B_VISIBLE -Wstrict-prototypes -g -O2 -L/opt/local/lib -o ntptime
ntptime.o ../libntp/libntp.a -lresolv -intl
What's confusing to me is that libntp.a includes those symbols:
% nm -AU ../libntp/libntp.a | grep _lib_nextbuf
../libntp/libntp.a:lib_strbuf.o: 0000000000000004 C _lib_nextbuf
% nm -AU ../libntp/libntp.a | grep _lib_stringbuf
../libntp/libntp.a:lib_strbuf.o: 0000000000000800 C _lib_stringbuf
I'm clearly missing something - but I'm not sure what it is. Any thoughts?
Apparently Apple's linker doesn't recognise common symbols in static
libraries as being defined. Workaround would be to initialise the
variables somewhere or use -fno-common. Ideally don't use common linkage
at all, have one file that each global actually lives in and have all
other declarations be extern.
- Josh