Bug 224094

Summary: Modifying file (caption, keywords, EXIF) takes a very long time and 100 % CPU
Product: [Applications] digikam Reporter: Simon <simon.eu>
Component: Metadata-ExifAssignee: Digikam Developers <digikam-bugs-null>
Status: RESOLVED UPSTREAM    
Severity: normal CC: ahuggel, caulier.gilles, freanki, mike, msp
Priority: NOR    
Version: 1.1.0   
Target Milestone: ---   
Platform: unspecified   
OS: Linux   
Latest Commit: Version Fixed In: 1.1.0
Attachments: Output of cmake, if of any interest

Description Simon 2010-01-24 22:40:47 UTC
Version:           1.1.0 (rev.: 1079718) (using 4.3.4 (KDE 4.3.4), Debian packages)
Compiler:          cc
OS:                Linux (i686) release 2.6.32-4.slh.2-sidux-686

I've got this since (very) roughly a month. (Perhaps only half a month.)

Scenario: I've got ridiculous 40 images on my SD card with a total size of 60 MB. Resolution is 12 MP. Copying them via digikam Import dialog takes about ten minutes. Doing the same with any file manager takes 2 seconds. (This is about 300 times faster.)

Timing for copying one single file with digikam:
0.1 s: copy process
9.9 s: EXIF rotating file DSC_whatever
ALL of these files did NOT need to be rotated. So 99% of this time digikam was doing simply nothing but wasting CPU time and power. The CPU was at 100 % during the EXIF rotating process.

Same when writing data to a pic (Caption, Tag, ...). Writing takes 10 seconds too. 

I've got a 3.3 GHz Core2Duo.
Doing the same on my laptop with an old 2 GHz Core2Duo takes 0.1 seconds. At most.

So what is going on there? I cannot possibly work with digikam this way.


I'm using digikam from SVN, this version checked out today. I did a 
$ cmake -DCMAKE_BUILD_TYPE=debugfull -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix` ../../graphics && make clean && make -j3 
and then 
# make install

Wrong packets installed? Or what is the reason for that?
Comment 1 Simon 2010-01-24 22:43:18 UTC
Created attachment 40211 [details]
Output of cmake, if of any interest
Comment 2 Simon 2010-01-24 22:56:14 UTC
PS: When editing an image in the Image Editor and saving it then it takes about one second.
Comment 3 caulier.gilles 2010-01-25 08:37:26 UTC
Which Exiv2 and libkexiv2 version you use ? Go to Help/Components Info for details.

which image file format you use ? JPEG ? RAW ? another one ?

Gilles Caulier
Comment 4 Simon 2010-01-25 14:59:52 UTC
Simple JPEG images.
Samep problem with images that worked fine before, by the way. 

Some other observations:
* Okay with .avi files
* Okay with old 3 MP pics
* Okay with D100 6 MP pics
* Giving stars is ok too
* Absolute FAIL for D90 12 MP images
* Same for D90 imagee that has been edited with the Image Editor and saved with new filename
* Same even with D90 images reduced to 3 MP!

digiKam version 1.1.0 (rev.: 1079718)
Exiv2 can write to Jp2: Yes
Exiv2 can write to Jpeg: Yes
Exiv2 can write to Pgf: Yes
Exiv2 can write to Png: Yes
Exiv2 can write to Tiff: Yes
Exiv2 supports XMP metadata: Yes
LibCImg: 130
LibExiv2: 0.19
LibJPEG: 62
LibJasper: 1.900.1
LibKDE: 4.3.4 (KDE 4.3.4)
LibKExiv2: 0.6.0
LibKdcraw: 0.5.0
LibLCMS: 118
LibPGF: 6.09.44
LibPNG: 1.2.42
LibQt: 4.5.3
LibRaw: 0.7.2
LibTIFF: LIBTIFF, Version 3.9.2 Copyright (c) 1988-1996 Sam Leffler Copyright (c) 1991-1996 Silicon Graphics, Inc.
Marble widget: 0.8.1
Parallelized demosaicing: Yes
LibGphoto2: 2.4.6
LibKipi: 0.4.0
Comment 5 caulier.gilles 2010-01-25 15:02:06 UTC
Please give us a web link where we can download images to test in local...

Gilles Caulier
Comment 7 Andreas Huggel 2010-01-25 15:55:49 UTC
Simon, what happens if you repeat the experiment with Exiv2 0.18.2?
I wonder if the Nikon makernote updates in 0.19 could be the cause of this.

Andreas
Comment 8 Simon 2010-01-25 16:04:36 UTC
# dpkg -i libexiv2-5_0.18.2-1+b1_i386.deb
(Lese Datenbank ... 259920 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereiten zum Ersetzen von libexiv2-5 0.18.2-1+b1 (durch libexiv2-5_0.18.2-1+b1_i386.deb) ...
Entpacke Ersatz für libexiv2-5 ...
Richte libexiv2-5 ein (0.18.2-1+b1) ...

Still got 0.19 in the components information after doing a cmake && make && make install. Will restart, make clean and rebuild later and try again (then it should work, right?)
Comment 9 caulier.gilles 2010-01-25 16:09:36 UTC
libkexiv2 must be recompiled with new Exiv2, and after digiKam/kipi-plugins. Check if new Exiv2 0.19 is really used by Help/Components Info menu entry

Gilles Caulier
Comment 10 Andreas Huggel 2010-01-25 16:42:26 UTC
Maybe quicker, if you haven't recompiled everything yet: Just take the 3MP D90 files, run

$ exiv2 -M'set Exif.Image.Make NoName' *.jpg

and try with these and 0.19. Any difference?

Andreas
Comment 11 Simon 2010-01-25 22:08:25 UTC
Andreas, I haven't got an exiv2 command here. What is missing? 

Gilles, libkexiv2-7-dev is installed here and ... I just saw that libexiv2-6 is still installed (2-5 too). I cannot remove the 2-6 version because of dependencies. 

Any ideas?


# apt-get remove libexiv2-6
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut
Status-Informationen einlesen... Fertig
Probieren Sie »apt-get -f install«, um dies zu korrigieren:
Die folgenden Pakete haben nicht-erfüllte Abhängigkeiten:
  gpscorrelate: Hängt ab: libexiv2-6 soll aber nicht installiert werden
  gpscorrelate-gui: Hängt ab: libexiv2-6 soll aber nicht installiert werden
  hugin: Hängt ab: libexiv2-6 soll aber nicht installiert werden
  hugin-tools: Hängt ab: libexiv2-6 soll aber nicht installiert werden
  krename: Hängt ab: libexiv2-6 soll aber nicht installiert werden
  libhdf5-serial-dev: Hängt ab: libhdf5-serial-1.8.4 (= 1.8.4-1) soll aber nicht installiert werden
  libkexiv2-7: Hängt ab: libexiv2-6 soll aber nicht installiert werden
  libstreamanalyzer0: Hängt ab: libexiv2-6 soll aber nicht installiert werden
  qtpfsgui: Hängt ab: libexiv2-6 soll aber nicht installiert werden
  ufraw: Hängt ab: libexiv2-6 soll aber nicht installiert werden
Comment 12 Mark Purcell 2010-01-26 14:57:09 UTC
Simon,

# apt-get install exiv2

digikam/kipi-plugins/ libkexiv2 in Debian unstable are all built against exiv2 0.19..

Mark
Comment 13 Andreas Huggel 2010-01-27 13:54:24 UTC
Simon,

If you want to compile with libexiv2 0.18.2, you don't really need to remove the installed Debian package. It's enough to remove libexiv2-dev, or, if that's also not easily possible, just remove or rename the following three files: /usr/lib/libexiv2.a, /usr/lib/libexiv2.la and /usr/lib/libexiv2.so (that's a link).

Then get the 0.18.2 tarball from http://www.exiv2.org/archive.html and build it as per the README. By default it installs into directories below /usr/local/, so it won't interfere with the Debian version in /usr. You may need to add /usr/local/lib to LD_LIBRARY_PATH and /usr/local/lib/pkgconfig to PKG_CONFIG_PATH though.

When it's done you can use the ldd command to double-check exactly what libraries a program or another library is using.

Andreas
Comment 14 Simon 2010-01-27 17:40:41 UTC
Thanks for your answer, Andreas. Unfortunately, this is how my system looks like right now.
# apt-cache policy libexiv2-dev
libexiv2-dev:
  Installiert: (keine)

/# mlocate */libexiv2.*
/usr/lib/libexiv2.so.4
/usr/lib/libexiv2.so.4.0.1
/usr/lib/libexiv2.so.5
/usr/lib/libexiv2.so.5.3.1
/usr/lib/libexiv2.so.6
/usr/lib/libexiv2.so.6.0.0



Now I compiled 0.18.2, as you suggested, and did
export LD_LIBRARY_PATH=/usr/local/lib && export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ && cmake -DCMAKE_BUILD_TYPE=debugfull -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix` ../../graphics
After compiling digikam again (without make clean): Exactly the same. 0.19.

Am I too stupid for that?

Simon
Comment 15 Simon 2010-01-27 17:47:23 UTC
Okay, I'm very likely gonna break my system now.
/usr/lib# for i in libexiv2.so.*; do mv $i ${i}_; done
But the way it is now sucks that much anyway, so I'm gonna risk it.

cmake always mentions libkexiv2 only, but never libexiv2. By the way.
-- Found Kexiv2 library in cache: /usr/lib/libkexiv2.so

By the way. Is it normal that pictures I import with digikam are totally different from the original files? I compared with vbindiff, the first few bytes matched, but then nothing was equal anymore and the file sizes didn't match either.


Ah well.

[ 27%] Building CXX object kipi-plugins/timeadjust/CMakeFiles/kipiplugin_timeadjust.dir/timeadjustdialog.o                                 
/usr/bin/ld: warning: libexiv2.so.6, needed by /usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so, not found (try using -rpath or -rpath-link)                                                                                                                            
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifData::erase(__gnu_cxx::__normal_iterator<Exiv2::Exifdatum*, std::vector<Exiv2::Exifdatum, std::allocator<Exiv2::Exifdatum> > >)'                                                   
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpProperties::registerNs(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                                                                                                                                          
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcKey::~IptcKey()'                        
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpParser::encode(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, Exiv2::XmpData const&, unsigned short, unsigned int)'                                       
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpParser::initialize()'                    
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcParser::decode(Exiv2::IptcData&, unsigned char const*, unsigned int)'                                                                                                              
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifParser::decode(Exiv2::ExifData&, unsigned char const*, unsigned int)'                                                                                                              
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifData::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                                                                                   
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::operator=(Exiv2::Exifdatum const&)'                                                                                                                                         
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::operator=(unsigned short const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpData::add(Exiv2::XmpKey const&, Exiv2::Value const*)'                                                                                                                               
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Value::create(Exiv2::TypeId)'               
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcData::sortByKey()'                      
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Photoshop::setIptcIrb(unsigned char const*, long, Exiv2::IptcData const&)'                                                                                                             
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifTags::tagTitle(unsigned short, Exiv2::IfdId)'                                                                                                                                      
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Iptcdatum::operator=(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                                                                                   
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpData::findKey(Exiv2::XmpKey const&)'     
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpProperties::propertyTitle(Exiv2::XmpKey const&)'                                                                                                                                    
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::Exifdatum(Exiv2::Exifdatum const&)'                                                                                                                                         
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpKey::~XmpKey()'                          
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::operator=(Exiv2::Value const&)'  
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::operator=(int const&)'           
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpProperties::propertyDesc(Exiv2::XmpKey const&)'                                                                                                                                     
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifThumb::setJpegThumbnail(unsigned char const*, long)'                                                                                                                               
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ImageFactory::open(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                                                                                     
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifKey::tag() const'                       
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::DataValue::DataValue(unsigned char const*, long, Exiv2::ByteOrder, Exiv2::TypeId)'                                                                                                     
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifParser::encode(std::vector<unsigned char, std::allocator<unsigned char> >&, unsigned char const*, unsigned int, Exiv2::ByteOrder, Exiv2::ExifData const&)'                         
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpParser::terminate()'                     
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpParser::decode(Exiv2::XmpData&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                                                                     
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifData::findKey(Exiv2::ExifKey const&)'   
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpData::clear()'                           
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpData::begin()'                           
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpData::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'                                                                                    
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Iptcdatum::operator=(unsigned short const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::DataBuf::reset(std::pair<unsigned char*, long>)'                                                                                                                                       
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::Exifdatum(Exiv2::ExifKey const&, Exiv2::Value const*)'                                                                                                                      
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Iptcdatum::operator=(Exiv2::Value const&)'  
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifData::clear()'                          
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcDataSets::dataSetDesc(unsigned short, unsigned short)'                                                                                                                             
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::version()'                                  
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Xmpdatum::Xmpdatum(Exiv2::Xmpdatum const&)' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Image::checkMode(Exiv2::MetadataId) const'  
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `typeinfo for Exiv2::Error'                         
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::operator=(std::pair<int, int> const&)'                                                                                                                                      
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifTags::tagDesc(unsigned short, Exiv2::IfdId)'                                                                                                                                       
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcParser::encode(Exiv2::IptcData const&)' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcData::add(Exiv2::IptcKey const&, Exiv2::Value*)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ImageFactory::open(unsigned char const*, long)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::operator=(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpKey::XmpKey(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcData::erase(__gnu_cxx::__normal_iterator<Exiv2::Iptcdatum*, std::vector<Exiv2::Iptcdatum, std::allocator<Exiv2::Iptcdatum> > >)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcDataSets::dataSetTitle(unsigned short, unsigned short)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::operator=(unsigned int const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Exifdatum::~Exifdatum()'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifData::add(Exiv2::ExifKey const&, Exiv2::Value const*)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifThumb::ExifThumb(Exiv2::ExifData&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpData::erase(__gnu_cxx::__normal_iterator<Exiv2::Xmpdatum*, std::vector<Exiv2::Xmpdatum, std::allocator<Exiv2::Xmpdatum> > >)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpData::sortByKey()'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifThumbC::copy() const'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Metadatum::print(Exiv2::ExifData const*) const'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcData::operator[](std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcKey::record() const'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifKey::~ExifKey()'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpData::end()'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcKey::IptcKey(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::XmpData::empty() const'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::DataBuf::release()'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifKey::ExifKey(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::DataValue::DataValue(Exiv2::TypeId)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcData::findKey(Exiv2::IptcKey const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Iptcdatum::Iptcdatum(Exiv2::Iptcdatum const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::DataValue::read(unsigned char const*, long, Exiv2::ByteOrder)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifData::sortByKey()'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::ExifThumbC::ExifThumbC(Exiv2::ExifData const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Iptcdatum::operator=(Exiv2::Iptcdatum const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::Xmpdatum::operator=(Exiv2::Xmpdatum const&)'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::IptcKey::tag() const'
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/libkexiv2.so: undefined reference to `Exiv2::DataValue::~DataValue()'
collect2: ld returned 1 exit status
make[2]: *** [kipi-plugins/dngconverter/test/raw2dng] Fehler 1
make[1]: *** [kipi-plugins/dngconverter/test/CMakeFiles/raw2dng.dir/all] Fehler 2
make[1]: *** Warte auf noch nicht beendete Prozesse...
[ 27%] Building CXX object kipi-plugins/timeadjust/CMakeFiles/kipiplugin_timeadjust.dir/clockphotodialog.o
Linking CXX shared module ../../lib/kipiplugin_timeadjust.so
[ 27%] Built target kipiplugin_timeadjust
make: *** [all] Fehler 2
Comment 16 Andreas Huggel 2010-01-27 18:20:05 UTC
Simon,

digiKam doesn't use libexiv2 directly. There is another layer in-between: libkexiv2. Therefore, you need to recompile libkexiv2 now, against the newly compiled libexiv2 0.18.2 (and take similar precautions again to make sure the old one is not used by mistake). Right now you have a libkexiv2 which is linked with the no-longer available libexiv2.so.6 aka 0.19.

Gilles or someone else from the digiKam team can give better advise on how to compile libkexiv2 than me.

The other potential problem, the old /usr/libexiv2.so.5, you have already addressed by moving it. Keep it that way for the time being.

Andreas
Comment 17 Simon 2010-01-27 20:12:41 UTC
Okay ...

I did a quick test and made the libexiv2.so.6 point to the 0.18.2 version. digikam then said it was using the 0.18.2 version but did not show any images anymore. That's even a little less useful than the other problem (which makes me avoid digikam whenever possible). 

When has 0.19 been added to the debian repo, by the way? (I'm using debian unstable)

Simon
Comment 18 Mark Purcell 2010-01-27 22:02:11 UTC
exiv2 0.19 arrived in Debian unstable on 1 Jan:
http://packages.debian.org/changelogs/pool/main/e/exiv2/exiv2_0.19-1/changelog
Comment 19 Mark Purcell 2010-01-27 22:26:29 UTC
Using the test file from #6 & exiv2 0.19 it takes some 20 seconds to reset NoName:

$ time exiv2 -M'set Exif.Image.Make NoName' digikam-example-d90.jpg

real    0m20.371s
user    0m20.141s
sys     0m0.052s

Downgrading to exiv2 0.18.2 (and refreshing the test file) works much smoother:

mark@hp:~/Desktop/digikam-test$ exiv2 -V
exiv2 0.18.2
Copyright (C) 2004-2009 Andreas Huggel.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301 USA

$ time exiv2 -v -M'set Exif.Image.Make NoName' digikam-example-d90.jpg
File 1/1: digikam-example-d90.jpg
Set Exif.Image.Make "NoName" (Ascii)

real    0m0.087s
user    0m0.020s
sys     0m0.032s

So issue isn't with digikam, rather exiv2..

I have placed a copy of exiv2 0.18.2 .deb at http://people.debian.org/~msp/,
however this will still require the rebuild of libkexiv2, which is non-trivial..
Comment 20 Johannes Wienke 2010-01-27 22:29:20 UTC
Mark, can you file a report at the exiv2 bug tracker for this issues. I will mark this report UPSTREAM as we cannot do much about this.
Comment 21 Mark Purcell 2010-01-27 22:44:44 UTC
Forwarded upstream:
http://dev.exiv2.org/issues/show/677
Comment 22 Simon 2010-01-31 12:21:41 UTC
Thank you very much for testing and reporting, Mark. And thanks everyone else for helping.

I hope this bug will be fixed soon. Is there perhaps a program that can star/tag images without exiv2 that I can use in the meantime? I need to edit roughly 800 pictures from yesterday, and this is simply impossible this way.
Comment 23 Simon 2010-02-11 21:29:08 UTC
Andreas, I saw you fixed the bug :) I'm really glad about that. Thanks a lot!

I wonder how long it might take until the changes are in the debian unstable repo? Or might I, in this case, simply compile libexiv2 without libkexiv?

Simon
Comment 24 Andreas Huggel 2010-02-17 15:17:38 UTC
Simon,

Although I'm considering releasing 0.20 earlier than originally planned due to this and another important fix (but w/o the Canon features), it will still take a couple of weeks until I get it out. So it may be worth taking the trouble and compiling yourself. You'll need to compile libkexiv2 too, though.

Andreas
Comment 25 Simon 2010-02-21 13:52:04 UTC
Well, trouble seems to be the correct word ;) 

Linking CXX executable digikam
/usr/lib/libkexiv2.so: undefined reference to `Exiv2::ExifData::erase(__gnu_cxx::__normal_iterator<Exiv2::Exifdatum*, std::vector<Exiv2::Exifdatum, std::allocator<Exiv2::Exifdatum> > >)'
/usr/lib/libkexiv2.so: undefined reference to `typeinfo for Exiv2::Error'

I've checked out the libexiv2 SVN directory and built/installed it to /usr/local/lib. Now I saw that libkexiv is located in kdegraphics which is somehow accessed by digikam's cmake. Is there a way to tell cmake to build libkexiv2 too, using the libexiv2 in /usr/local/lib? Or am I on the completely wrong way with what I'm doing? My experience with libraries is 0 so far.

Simon
Comment 26 Johannes Wienke 2010-02-21 14:42:06 UTC
You must also rebuilt libkexiv by hand.
Comment 27 Simon 2010-02-21 15:20:21 UTC
Is it enough to just build it in the kgraphics directory? As there is no rule for «make install». Or do I manually have to ln -s the new libraries in /usr/lib?
Comment 28 Simon 2010-02-21 15:22:34 UTC
Is it enough to just build it in the kgraphics directory? As there is no rule for «make install». Or do I manually have to ln -s the new libraries in /usr/lib?
Comment 29 Johannes Wienke 2010-02-22 21:43:30 UTC
After you have configured cmake in the kdegrahics libs directory, you should be able to only build kexiv and install it from its own subdirectoy.
Comment 30 Simon 2010-02-22 22:32:08 UTC
Indeed! This is great.

I run cmake with -DCMAKE_INSTALL_PREFIX=/usr to install the libraries over the ones from apt. I guess this is not totally ethically correct, but right now it's working ;)

Thank you!
Comment 31 Michael G. Hansen 2010-02-22 22:57:45 UTC
(In reply to comment #30)
> I run cmake with -DCMAKE_INSTALL_PREFIX=/usr to install the libraries over the
> ones from apt. I guess this is not totally ethically correct, but right now
> it's working ;)

To make it more 'ethically correct', you can wrap the installation using checkinstall. It will put all the files into .deb file, so you can easily remove them later.

Basically you just have to 'apt-get install checkinstall' and then 'checkinstall make install' in the directory where you compiled the library.

Michael
Comment 32 Simon 2010-02-25 20:16:17 UTC
Cool! checkinstall seems to rule :)

I actually had to do
# checkinstall  --dpkgflags=--force-overwrite --pkgrelease 0.19-1.1 make install
(«trying to overwrite blabla, which is also in <installed deb from repo>») as here:
http://forums.debian.net/viewtopic.php?p=98899&sid=db505d83319554722ea7e7c3b308283d
Although this bug is said to have been solved in 1.6.1-4 (1.6.1-10 here).

Simon
Comment 33 Simon 2010-03-08 16:22:03 UTC
Hm, one more question. When I do this with libkexiv2, is it libkexiv2-7 or libkexiv2-7-dev?

Simon
Comment 34 Frank Hommes 2010-04-20 17:42:47 UTC
*** Bug 234889 has been marked as a duplicate of this bug. ***