Author Topic: C::B With IM  (Read 14749 times)

Offline kirash4

  • Multiple posting newcomer
  • *
  • Posts: 42
C::B With IM
« on: April 06, 2014, 05:53:10 am »
Ok, this is rather silly. I can't seem to get C::B to compile anything using ImageMagick. Folks on here point fingers at ImageMagick, and the ImageMagick folks point their finger back to C::B. I've seen so many different posts of people trying all manners of options and configuration and I tried them all, nothing works. I don't understand why it's so hard to make it work. I have zero problems on my unix platform: compile IM, install the headers, write my c++ program, compile and link it against IM. Done. It works.

I've spent the better part of this past week fighting with C::B and IM and nothing. I hate having to write my code in C::B, save it to my unix server just to compile it there. And I don't fancy setting up a cross-compiler environment just so I can create Win32 applications. That's the whole reason I'm trying to use C::B with, hopefully, wxWidgets. But I need ImageMagick support as well.

So, has anyone been able to successfully compile code with IM support, using C::B? If so, what steps did you follow? What version of IM did you install, or did you compile it from sources (and if so, did you use C::B to compile it?) What settings did you have to set in C::B to make it work? No matter of options, that I've seen online, appear to work, in the end the linker always fails with unresolved symbols that would normally be there if it links properly.


Offline kirash4

  • Multiple posting newcomer
  • *
  • Posts: 42
Re: C::B With IM
« Reply #2 on: April 06, 2014, 10:31:39 pm »
I feel I'm starting yet another dead-end thread as I have yet to find a solution on these forums or elsewhere. Everyone posts the errors, no one has an answer. But, since you pointed me to that page, let's see if that's all you can help with:

-----

I am running Code::Blocks version 13.12 on Windows
(Windows 7 Ultimate 64-bit). The compiler I use is MinGW
version 4.7.1 32-bit.  <-- the one that comes with C::B.

When I ...
Simply can't finish a compile of anything that requires to be linked against the ImageMagick library. Other code that does not use IM compiles fine, no problems. That tells me the compiler itself is working fine. It's merely the final linking step, against IM, that doesn't appear to work, or rather, I can't figure out how it should be configured to work.

Description of problem.
C::B compiles the .o object file but then fails to link it to create the final executable.

Build log:
Code: [Select]
mingw32-g++.exe -O2 -I"C:\Program Files\ImageMagick-6.8.8-Q16\include" -c T:\povpoi\arc.cpp -o T:\povpoi\arc.o
mingw32-g++.exe -L"C:\Program Files\ImageMagick-6.8.8-Q16\lib" -o T:\povpoi\arc.exe T:\povpoi\arc.o   "C:\Program Files\ImageMagick-6.8.8-Q16\lib\CORE_RL_magick_.lib" "C:\Program Files\ImageMagick-6.8.8-Q16\lib\CORE_RL_Magick++_.lib" "C:\Program Files\ImageMagick-6.8.8-Q16\lib\CORE_RL_wand_.lib"
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x84): undefined reference to `Magick::InitializeMagick(char const*)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x249): undefined reference to `Magick::Image::Image(std::string const&)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x26a): undefined reference to `Magick::Image::constImage() const'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x2c8): undefined reference to `Magick::Image::unsharpmask(double, double, double, double)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x2ed): undefined reference to `Magick::Color::Color(unsigned short, unsigned short, unsigned short)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x305): undefined reference to `Magick::Image::constImage() const'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x344): undefined reference to `Magick::Geometry::Geometry(unsigned int, unsigned int, int, int, bool, bool)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x36f): undefined reference to `Magick::Image::extent(Magick::Geometry const&, Magick::Color const&)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x387): undefined reference to `Magick::Geometry::~Geometry()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x392): undefined reference to `Magick::Image::constImage() const'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x3d2): undefined reference to `Magick::Geometry::Geometry(unsigned int, unsigned int, int, int, bool, bool)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x3f3): undefined reference to `Magick::Image::size(Magick::Geometry const&)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x409): undefined reference to `Magick::Geometry::~Geometry()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x41b): undefined reference to `Magick::Image::virtualPixelMethod(MagickCore::VirtualPixelMethod)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x45c): undefined reference to `Magick::Image::distort(MagickCore::DistortImageMethod, unsigned int, double const*, bool)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x471): undefined reference to `Magick::Image::virtualPixelMethod(MagickCore::VirtualPixelMethod)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x4b0): undefined reference to `Magick::Image::distort(MagickCore::DistortImageMethod, unsigned int, double const*, bool)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x4be): undefined reference to `Magick::Image::constImage() const'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x4d5): undefined reference to `Magick::Image::constImage() const'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x513): undefined reference to `Magick::Geometry::Geometry(unsigned int, unsigned int, int, int, bool, bool)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x546): undefined reference to `Magick::Image::extent(Magick::Geometry const&, Magick::Color const&, MagickCore::GravityType)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x55e): undefined reference to `Magick::Geometry::~Geometry()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x572): undefined reference to `Magick::Image::write(std::string const&)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x588): undefined reference to `Magick::Color::~Color()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x59d): undefined reference to `Magick::Image::~Image()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x601): undefined reference to `Magick::Geometry::Geometry(char const*)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x620): undefined reference to `Magick::Image::resize(Magick::Geometry const&)'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x636): undefined reference to `Magick::Geometry::~Geometry()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x8bf): undefined reference to `Magick::Geometry::~Geometry()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x8d4): undefined reference to `Magick::Color::~Color()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x8e9): undefined reference to `Magick::Image::~Image()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x903): undefined reference to `Magick::Geometry::~Geometry()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x91a): undefined reference to `Magick::Geometry::~Geometry()'
T:\povpoi\arc.o:arc.cpp:(.text.startup+0x931): undefined reference to `Magick::Geometry::~Geometry()'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 1 second(s))
34 error(s), 0 warning(s) (0 minute(s), 1 second(s))

Crash report:
Code: [Select]
Code::Blocks did not crash.

    (Although the following is not necessary, showing that you
     have tried increases the probability of a response.)
I have already tried ...
Every error report I've read/seen online pointed to needing to add the libraries and search paths in C::B, which I have done. When I don't do that, the compiler immediately stops because it can't find 'Magick++.h', so that tells me that at least *some* of the configuration is working, but there's still something missing. So here it is, one at a time:

- Settings->Compiler...
- Under 'Linker Settings' I added the libraries:
Code: [Select]
C:\Program Files\ImageMagick-6.8.8-Q16\lib\CORE_RL_magick_.lib
C:\Program Files\ImageMagick-6.8.8-Q16\lib\CORE_RL_Magick++_.lib
C:\Program Files\ImageMagick-6.8.8-Q16\lib\CORE_RL_wand_.lib
- 'Other linker options' is empty.
- Under 'Search directories -> Compiler', I added:
Code: [Select]
C:\Program Files\ImageMagick-6.8.8-Q16\include- Under 'Search directories -> Linker', I added:
Code: [Select]
C:\Program Files\ImageMagick-6.8.8-Q16\lib
That's all of it.

As for compiling the code from the command line, it won't work in a Win32 shell because IM does not provide a 'Magick++-config' for Win32 platforms. However, in a cygwin environment it compiles fine. On a unix platform, it compiles fine. The command line used in those environments is:
Code: [Select]
c++ -O2 <file>.cpp -o <compiled-binary> `Magick++-config --cppflags --cxxflags --ldflags --libs`

Offline BlueHazzard

  • Developer
  • Lives here!
  • *****
  • Posts: 2541
Re: C::B With IM
« Reply #3 on: April 06, 2014, 10:48:13 pm »
This is a nice compiler error report  from you. It is uncommon to see something complete ;) .

I have no idea what Image hack is nor have i worked with it. But i can give you some general linker hints. gcc is a bit annoying with the order of the libraries. So try to rearrange the libraries in 'Linker Settings'. This are only 3 libraries, so you can try every combination ;)

greetings

Offline kirash4

  • Multiple posting newcomer
  • *
  • Posts: 42
Re: C::B With IM
« Reply #4 on: April 06, 2014, 11:01:23 pm »
I've gone through every permutation of the order and it always fails with the same exact thing. For that matter, if I completely remove the libraries from 'Linker settings' the error remains the same. It's as if it completely ignores the libraries. I don't know if there are linker options I need to be setting (and if so, what they would be.)

Offline dmoore

  • Developer
  • Lives here!
  • *****
  • Posts: 1576
Re: C::B With IM
« Reply #5 on: April 06, 2014, 11:03:19 pm »
See

http://www.imagemagick.org/discourse-server/viewtopic.php?f=2&t=22571#p94136

You can use those imagemagick-config commands as other options in the compiler and linker settings of your project (by enclosing them in back quotes) and they will passed to gcc

Offline kirash4

  • Multiple posting newcomer
  • *
  • Posts: 42
Re: C::B With IM
« Reply #6 on: April 06, 2014, 11:11:18 pm »
All of what's on that page is done on a unix environment. MagickWand-config doesn't exist on the Windows platform. But since I have a unix environment available:
Code: [Select]
MagickWand-config --cflags --cppflags
-fopenmp -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I/usr/local/include/ImageMagick-6
-fopenmp -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I/usr/local/include/ImageMagick-6

And:
Code: [Select]
MagickWand-config --ldflags --libs
-L/usr/local/lib -lMagickWand-6.Q16 -lMagickCore-6.Q16
-L/usr/local/lib -lMagickWand-6.Q16 -lMagickCore-6.Q16

So what should I be adding to the linker options?

Offline BlueHazzard

  • Developer
  • Lives here!
  • *****
  • Posts: 2541
Re: C::B With IM
« Reply #7 on: April 06, 2014, 11:14:10 pm »
You can use those imagemagick-config commands as other options in the compiler and linker settings of your project (by enclosing them in back quotes) and they will passed to gcc

i think on windows this won't work easily...

I've gone through every permutation of the order and it always fails with the same exact thing. For that matter, if I completely remove the libraries from 'Linker settings' the error remains the same. It's as if it completely ignores the libraries. I don't know if there are linker options I need to be setting (and if so, what they would be.)

i reread your log, and i think you added the libraries in the wrong field, because there is no -l at the beginning of the library names:
you have to add the libraries in Project->Build Options->Linker Settings->Link libraries

greetings

Offline dmoore

  • Developer
  • Lives here!
  • *****
  • Posts: 1576
Re: C::B With IM
« Reply #8 on: April 06, 2014, 11:17:46 pm »
In the one I downloaded here: http://www.imagemagick.org/script/binary-releases.php

MagicWand-config exists, but it's a bash script, so you need some sort of bash scripting environment installed, which I think ships with modern mingws...

Offline dmoore

  • Developer
  • Lives here!
  • *****
  • Posts: 1576
Re: C::B With IM
« Reply #9 on: April 06, 2014, 11:18:25 pm »
You can use those imagemagick-config commands as other options in the compiler and linker settings of your project (by enclosing them in back quotes) and they will passed to gcc

i think on windows this won't work easily...

What doesn't work? Backtick substitutions in C::B work fine on windows and linux.

Offline BlueHazzard

  • Developer
  • Lives here!
  • *****
  • Posts: 2541
Re: C::B With IM
« Reply #10 on: April 06, 2014, 11:20:12 pm »
You can use those imagemagick-config commands as other options in the compiler and linker settings of your project (by enclosing them in back quotes) and they will passed to gcc

i think on windows this won't work easily...

What doesn't work? Backtick substitutions in C::B work fine on windows and linux.
the unix build script with windows

Offline jens

  • Administrator
  • Lives here!
  • *****
  • Posts: 7265
    • Jens' unofficial debian-repository for the Code::Blocks - IDE
Re: C::B With IM
« Reply #11 on: April 06, 2014, 11:21:46 pm »
All of what's on that page is done on a unix environment. MagickWand-config doesn't exist on the Windows platform. But since I have a unix environment available:
Code: [Select]
MagickWand-config --cflags --cppflags
-fopenmp -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I/usr/local/include/ImageMagick-6
-fopenmp -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16 -I/usr/local/include/ImageMagick-6

And:
Code: [Select]
MagickWand-config --ldflags --libs
-L/usr/local/lib -lMagickWand-6.Q16 -lMagickCore-6.Q16
-L/usr/local/lib -lMagickWand-6.Q16 -lMagickCore-6.Q16

So what should I be adding to the linker options?
I would try adding the path to the lib-folder to the libraries search-path and the name of the libs without path and extension to the link-library list.
If the libs are compiled with c and not c++ you might get problems because of name mangling, if they are compiled with/for cygwin, they might not work at all with gcc.
For the name mangling problem (if you do not already know how to fix) search for "name mangling extern c" (https://duckduckgo.com/?q=name+mangling+extern+c).

Offline dmoore

  • Developer
  • Lives here!
  • *****
  • Posts: 1576
Re: C::B With IM
« Reply #12 on: April 06, 2014, 11:25:57 pm »
the unix build script with windows

hmm... it looks like it needs pkg-config, which you can get on windows but takes a bit of work (e.g. you need gtk for some strange reason)

i reread your log, and i think you added the libraries in the wrong field, because there is no -l at the beginning of the library names:
you have to add the libraries in Project->Build Options->Linker Settings->Link libraries

Try this.

Offline kirash4

  • Multiple posting newcomer
  • *
  • Posts: 42
Re: C::B With IM
« Reply #13 on: April 06, 2014, 11:26:44 pm »
I'm doing it in the global compiler settings because I'm not actually working inside of a project, just a single c++ file. Basically I took the same file I compile on my unix environment and opened it in C::B.


Offline kirash4

  • Multiple posting newcomer
  • *
  • Posts: 42
Re: C::B With IM
« Reply #14 on: April 06, 2014, 11:29:48 pm »
In the one I downloaded here: http://www.imagemagick.org/script/binary-releases.php

MagicWand-config exists, but it's a bash script, so you need some sort of bash scripting environment installed, which I think ships with modern mingws...

Which specifically did you download? I grabbed 'ImageMagick-6.8.8-10-Q16-x64-dll.exe' and there is no MagickWand-config script, at least not in its install folder.