MacOSX --with-adobe link issue. Work in progress. Code and documentation update.
parent
134df403e8
commit
aefa3e3d34
@ -0,0 +1,173 @@
|
||||
|
||||
|
||||
Puzzle with autotools/--with-adobe MacOS-X Only
|
||||
-----------------------------------------------
|
||||
Added : 2017-08-17
|
||||
Modified: 2017-08-18
|
||||
|
||||
The --with-adobe code is new (added on Monday/Tuesday 2017-08-15).
|
||||
It's very much "Work in Progress" and will get lots more polishing.
|
||||
This builds and links on Mac and Linux (Cygwin isn't ready yet).
|
||||
Autotools isn't used with Visual Studio
|
||||
|
||||
Default build (which compile/links xmpsdk/src) is fine (and passes test suite)
|
||||
$ sudo make distclean ; make config ; ./configure ; make ; sudo make install ; make samples ; make tests
|
||||
|
||||
Status: The 2016/AdobeXMPsdk requires an entry point that's not in the C++ STL library
|
||||
./configure is building and passing the test suite
|
||||
./configure --with-adobe=2014 is broken on __ZNSs4_Rep11_S_terminalE
|
||||
./configure --with-adobe=2016 is broken on __ZNSiD0Ev
|
||||
|
||||
The missing entry points are in /usr/lib/libstdc++.6.dylib
|
||||
When I use install_name_tool to change to libstdc++.6.dylib, I crash in this:
|
||||
|
||||
$ c++filt __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev
|
||||
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()
|
||||
$
|
||||
|
||||
There's something mixed up concerning the libraries used by Adobe's XMPSDK and libexiv2.26.dylib
|
||||
-stdlib=libstdc++ will link /usr/lib/libstdc++.6.dylib, however the compiler warns:
|
||||
clang: warning: libstdc++ is deprecated; move to libc++ [-Wdeprecated]
|
||||
|
||||
To build without the external Adobe SDK:
|
||||
- - - - - - - - - - - - - - - - - - - -
|
||||
Edit config/config.mk.in and modify:
|
||||
XMPSDK_LIBS= -lXMPCore
|
||||
to
|
||||
XMPSDK_LIBS = ''
|
||||
|
||||
$ sudo make distclean ; make config ; ./configure --with-adobe ; make
|
||||
|
||||
The following command works:
|
||||
$ bin/exiv2 http://clanmills.com/Stonehenge.jpg is working
|
||||
|
||||
On 2017-08-15 The following command crashes when it attempts to execute XMPsdk code
|
||||
$ bin/exiv2 --verbose --version
|
||||
........
|
||||
config_path=/Users/rmills/.exiv2
|
||||
uid=501
|
||||
euid=501
|
||||
gid=20
|
||||
dyld: lazy symbol binding failed: Symbol not found: _WXMPMeta_Initialize_1
|
||||
Referenced from: /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
|
||||
Expected in: flat namespace
|
||||
|
||||
dyld: Symbol not found: _WXMPMeta_Initialize_1
|
||||
Referenced from: /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
|
||||
Expected in: flat namespace
|
||||
|
||||
Abort trap: 6
|
||||
$
|
||||
|
||||
This is correct. libXMPCore.a is not in the mix.
|
||||
|
||||
ls -alt src/.libs/libexiv2.26.dylib
|
||||
-rwxr-xr-x+ 1 rmills staff 2238124 Aug 17 11:07 src/.libs/libexiv2.26.dylib
|
||||
-------
|
||||
To add the external Adobe SDK to the mix:
|
||||
- - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
Edit src/Makefile#242 and change:
|
||||
@$(LIBTOOL) --mode=link $(LINK.cc) -o ../bin/$@ $(LIBRARY) $(EXIV2OBJ) $(EXIV2COBJ) -rpath $(libdir)
|
||||
to:
|
||||
@$(LIBTOOL) --mode=link $(LINK.cc) -lXMPCore -o ../bin/$@ $(LIBRARY) $(EXIV2OBJ) $(EXIV2COBJ) -rpath $(libdir)
|
||||
|
||||
$ touch src/version.cpp src/exiv2.cpp ; make
|
||||
$ ls -alt src/.libs/libexiv2.26.dylib
|
||||
-rwxr-xr-x+ 1 rmills staff 4312308 Aug 17 11:17 src/.libs/libexiv2.26.dylib
|
||||
-------
|
||||
$ bin/exiv2
|
||||
dyld: Symbol not found: __ZNSiD0Ev
|
||||
Referenced from: /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
|
||||
Expected in: flat namespace
|
||||
in /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
|
||||
Abort trap: 6
|
||||
605 rmills@rmillsmbp:~/gnu/github/exiv2 $
|
||||
|
||||
$ c++filt _ZNSiD0Ev
|
||||
std::basic_istream<char, std::char_traits<char> >::~basic_istream()
|
||||
|
||||
This code is being accessed by Adobe XMPSDK 2016 libXMPCore.a and isn't in the c++ library.
|
||||
|
||||
$ nm -g xmpsdk/Adobe/libXMPCore.a | grep _ZNSiD0Ev
|
||||
U __ZNSiD0Ev
|
||||
$
|
||||
|
||||
Adobe XMPSDK 2014 has a similar problem with __ZNSs4_Rep11_S_terminalE
|
||||
|
||||
$ nm -g Adobe/XMP-Toolkit-SDK-CC201412/libXMPCore.a | grep __ZNSs4_Rep11_S_terminalE | sort --unique
|
||||
U __ZNSs4_Rep11_S_terminalE
|
||||
$ c++filt __ZNSs4_Rep11_S_terminalE
|
||||
std::string::_Rep::_S_terminal
|
||||
|
||||
|
||||
Notes (mostly to remind me of painful discoveries)
|
||||
--------------------------------------------------
|
||||
|
||||
How does the build get generated?
|
||||
$ make config
|
||||
This generates ./configure by reading config/configure.ac
|
||||
|
||||
When you use --with-adobe, CXXFLAGS and LDFLAGS are modified and ENABLE_XMP is set to 2016.
|
||||
Makefile has code to execute the script xmpsdk/buildXMPsdk.sh which
|
||||
downloads and builds the XMPsdk to create libCore.a (which we need) and libFiles.a
|
||||
|
||||
config/config.mk.in is converted into config/config.mk and included in xmpsdk/src/Makefile
|
||||
This is really ugly. config.mk also messes with CPPFLAGS and LDFLAGS
|
||||
|
||||
To get -lXMPCore into the mix, set XMPSDK_LIBS in config/config.mk.in
|
||||
XMPSDK_LIBS = -lXMPCore
|
||||
|
||||
508 rmills@rmillsmbp:~/gnu/github/exiv2 $ finder Makefile | xargs grep -H config.mk | grep include
|
||||
./contrib/organize/Makefile:include $(top_srcdir)/config/config.mk
|
||||
./doc/Makefile:include $(top_srcdir)/config/config.mk
|
||||
./samples/Makefile:include $(top_srcdir)/config/config.mk
|
||||
./src/Makefile:include $(top_srcdir)/config/config.mk
|
||||
./xmpsdk/src/Makefile:include $(top_srcdir)/config/config.mk
|
||||
509 rmills@rmillsmbp:~/gnu/github/exiv2 $
|
||||
|
||||
|
||||
Compiler options used to build Adobe XMPsdk
|
||||
-------------------------------------------
|
||||
|
||||
For sure, Adobe's code is being built with MacOSX10.8.sdk and -std=c++11
|
||||
|
||||
/usr/bin/c++
|
||||
-DBUILDING_XMPCORE_AS_STATIC=1
|
||||
-DBUILDING_XMPCORE_LIB=1
|
||||
-DENABLE_CPP_DOM_MODEL=1
|
||||
-DHAVE_EXPAT_CONFIG_H=1
|
||||
-DMAC_ENV=1
|
||||
-DXML_STATIC=1
|
||||
-DXMP_64=1
|
||||
-DXMP_COMPONENT_INT_NAMESPACE=AdobeXMPCore_Int
|
||||
-DXMP_StaticBuild=1
|
||||
-I/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/build/../..
|
||||
-I/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/build/../../public/include
|
||||
-I/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/build/../../third-party/expat/public/lib
|
||||
-I/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/build/../resource/mac
|
||||
-funsigned-char
|
||||
-fshort-enums
|
||||
-fno-common
|
||||
-Wall
|
||||
-Wextra
|
||||
-Wno-missing-field-initializers
|
||||
-Wno-shadow
|
||||
-Wno-reorder
|
||||
-std=c++11
|
||||
-Wnon-virtual-dtor
|
||||
-Woverloaded-virtual
|
||||
-Wno-unused-variable
|
||||
-Wno-unused-function
|
||||
-Wno-unused-parameter
|
||||
-fstack-protector
|
||||
-O3
|
||||
-DNDEBUG=1
|
||||
-D_NDEBUG=1
|
||||
-arch x86_64
|
||||
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
|
||||
-mmacosx-version-min=10.7
|
||||
-o CMakeFiles/XMPCoreStatic.dir/Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/source/XMPMeta-GetSet.cpp.o
|
||||
-c /Users/rmills/gnu/github/exiv2/xmpsdk/Adobe/XMP-Toolkit-SDK-CC201607/XMPCore/source/XMPMeta-GetSet.cpp
|
||||
|
||||
|
@ -1,116 +0,0 @@
|
||||
2017-08-17
|
||||
|
||||
Puzzle with autotools/--with-adobe (solved: seems to confined to my Mac Book Pro).
|
||||
-----------------------------------------------------------------------------------
|
||||
|
||||
The --with-adobe code is new (added on Monday/Tuesday 2017-08-15).
|
||||
It's very much "Work in Progress" and will get lots more polishing.
|
||||
This builds and links on Mac and Linux (Cygwin isn't ready yet).
|
||||
Autotools isn't used with Visual Studio
|
||||
|
||||
Default build (which compile/links xmpsdk/src) is fine (and passes test suite)
|
||||
$ sudo make distclean ; make config ; ./configure ; make ; sudo make install ; make samples ; make tests
|
||||
|
||||
To build with the external Adobe SDK:
|
||||
|
||||
$ sudo make distclean ; make config ; ./configure --with-adobe ; make
|
||||
|
||||
Linux --with-adobe is working when I remove calls to DeleteNamespace in src/xmp.cpp.
|
||||
The test suite is mostly OK. Some XMP output format has changed.
|
||||
There are some test crashes to be investigated.
|
||||
|
||||
So, this issue only concerns linking on the Mac.
|
||||
|
||||
The following command works:
|
||||
$ bin/exiv2 http://clanmills.com/Stonehenge.jpg is working
|
||||
|
||||
The following command crashes when it attempts to execute XMPsdk code
|
||||
$ bin/exiv2 --verbose --version
|
||||
........
|
||||
config_path=/Users/rmills/.exiv2
|
||||
uid=501
|
||||
euid=501
|
||||
gid=20
|
||||
dyld: lazy symbol binding failed: Symbol not found: _WXMPMeta_Initialize_1
|
||||
Referenced from: /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
|
||||
Expected in: flat namespace
|
||||
|
||||
dyld: Symbol not found: _WXMPMeta_Initialize_1
|
||||
Referenced from: /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
|
||||
Expected in: flat namespace
|
||||
|
||||
Abort trap: 6
|
||||
$
|
||||
|
||||
This is correct. libXMPCore.a is not in the mix.
|
||||
|
||||
ls -alt src/.libs/libexiv2.26.dylib
|
||||
-rwxr-xr-x+ 1 rmills staff 2238124 Aug 17 11:07 src/.libs/libexiv2.26.dylib
|
||||
-------
|
||||
Edit src/Makefile#242 and change:
|
||||
@$(LIBTOOL) --mode=link $(LINK.cc) -o ../bin/$@ $(LIBRARY) $(EXIV2OBJ) $(EXIV2COBJ) -rpath $(libdir)
|
||||
to:
|
||||
@$(LIBTOOL) --mode=link $(LINK.cc) -lXMPCore -o ../bin/$@ $(LIBRARY) $(EXIV2OBJ) $(EXIV2COBJ) -rpath $(libdir)
|
||||
|
||||
$ touch src/version.cpp src/exiv2.cpp ; make
|
||||
$ ls -alt src/.libs/libexiv2.26.dylib
|
||||
-rwxr-xr-x+ 1 rmills staff 4312308 Aug 17 11:17 src/.libs/libexiv2.26.dylib
|
||||
-------
|
||||
$ bin/exiv2
|
||||
dyld: Symbol not found: __ZNSiD0Ev
|
||||
Referenced from: /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
|
||||
Expected in: flat namespace
|
||||
in /Users/rmills/gnu/github/exiv2/src/.libs/libexiv2.26.dylib
|
||||
Abort trap: 6
|
||||
605 rmills@rmillsmbp:~/gnu/github/exiv2 $
|
||||
|
||||
$ c++filt _ZNSiD0Ev
|
||||
std::basic_istream<char, std::char_traits<char> >::~basic_istream()
|
||||
|
||||
It appears that libexiv2.26.dylib isn't linked to the STL libraries.
|
||||
However I think problem may be with the "flat namespace" which tells the
|
||||
dynamic linker to search for library names. The search order is:
|
||||
|
||||
$ otool -L bin/.libs/exiv2
|
||||
bin/.libs/exiv2:
|
||||
/usr/local/lib/libexiv2.26.dylib (compatibility version 26.0.0, current version 26.0.0)
|
||||
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)
|
||||
/usr/local/lib/libintl.8.dylib (compatibility version 10.0.0, current version 10.2.0)
|
||||
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
|
||||
/usr/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
|
||||
/usr/local/lib/libexpat.1.dylib (compatibility version 8.0.0, current version 8.0.0)
|
||||
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0)
|
||||
So, when he's loading libexiv2.26.dylib, he needs a symbol from libc++.1.dylib
|
||||
|
||||
Amazingly, I got it to work on Wednesday morning.
|
||||
I must have been confused. Something was working!
|
||||
|
||||
Notes (mostly to remind of painful discoveries)
|
||||
-----------------------------------------------
|
||||
|
||||
How does the build get generated?
|
||||
$ make config
|
||||
This generates ./configure by reading config/configure.ac
|
||||
|
||||
When you use --with-adobe, CXXFLAGS and LDFLAGS are modified and ENABLE_XMP is set to 2016.
|
||||
Makefile has code to execute the script xmpsdk/buildXMPsdk.sh which
|
||||
downloads and builds the XMPsdk to create libCore.a (which we need) and libFiles.a
|
||||
|
||||
config/config.mk.in is converted into config/config.mk and included in xmpsdk/src/Makefile
|
||||
This is really ugly. config.mk also messes with CPPFLAGS and LDFLAGS
|
||||
|
||||
To get -lXMPCore into the mix, set XMPSDK_LIBS in config/config.mk.in
|
||||
XMPSDK_LIBS = -lXMPCore
|
||||
|
||||
508 rmills@rmillsmbp:~/gnu/github/exiv2 $ finder Makefile | xargs grep -H config.mk | grep include
|
||||
./contrib/organize/Makefile:include $(top_srcdir)/config/config.mk
|
||||
./doc/Makefile:include $(top_srcdir)/config/config.mk
|
||||
./samples/Makefile:include $(top_srcdir)/config/config.mk
|
||||
./src/Makefile:include $(top_srcdir)/config/config.mk
|
||||
./xmpsdk/src/Makefile:include $(top_srcdir)/config/config.mk
|
||||
509 rmills@rmillsmbp:~/gnu/github/exiv2 $
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue