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