From: Quique F. <qui...@gm...> - 2005-12-28 13:19:16
|
Hello. I'm having problems to compile a program. I've checked the includes to see which libraries I had to link, and I thought that with vil.lib and vcl.lib would be enough, but I don't know if the problem is that I need to link against more libraries or that I haven't linked them correctly. I've installed the VXL using cmake and compiling the library with visual studio.net, and visual gave me the same linker errors. I've asked a friend who has more experience with the DevC++ environment, an= d he doesn't know what's the problem. The program is: #include <vcl_iostream.h> #include <vxl_config.h> #include <vil/vil_rgb.h> #include <vil/vil_load.h> #include <vil/vil_image_view.h> int main() { // Load image into memory. vil_image_view<vil_rgb<vxl_byte> > img =3D vil_load("foo.ppm"); // Access pixel (100,100) and print its value as an int. vcl_cerr << "Pixel 100,100 =3D ";// << img(100,100) << vcl_endl; return 0; } The include directories are the vcl and core subdirectories in the VXLBIN and VXLSRC I'm using DevCpp 4.9.9.2, which uses (I think) gcc 3.4.2. The operating system is windows xp, and the VXL version is 1.3.0. These are the linker errors, all related to functions from the libraries [Linker error] undefined reference to `vil_load(char const*)' [Linker error] undefined reference to `vil_image_view<vil_rgb<unsigned char> >::vil_image_view(vil_smart_ptr<vil_image_view_base> const&)' [Linker error] undefined reference to `vil_smart_ptr<vil_image_view_base>::unref(vil_image_view_base*)' [Linker error] undefined reference to `vcl_cassert_failure(char const*, int, char const*)' [Linker error] undefined reference to `vil_smart_ptr<vil_memory_chunk>::unref(vil_memory_chunk*)' [Linker error] undefined reference to `vcl_cassert_failure(char const*, int, char const*)' And finally, this are the command line: g++.exe cargar.o Cargar_Imagen_private.res -o "Cargar Imagen.exe" -L"E:/Dev-Cpp/lib" -L"E:/Programacion/VXL/VXLBIN/lib/debug" -lvil -lvcl I've subscribed today to this mailing list, and I've tried to follow the policy. If I've done something wrong, please tell me Thanks |
From: Peter V. <pet...@ya...> - 2005-12-29 09:52:14
|
> ... I thought that with vil.lib and vcl.lib would be enough ... That's right, these libraries should indeed contain the "undefined references" that you encounter. > g++.exe cargar.o Cargar_Imagen_private.res -o "Cargar Imagen.exe" > -L"E:/Dev-Cpp/lib" -L"E:/Programacion/VXL/VXLBIN/lib/debug" -lvil > -lvcl This looks correct at first sight; sorry but I have no experience with compiling on MS-Windows so I cannot help you any further. Did you consult the VXL FAQ, and/or any previous mailings on the list on this topic? I'm sure similar problems have been discussed before. -- Peter. |
From: Quique F. <qui...@gm...> - 2005-12-29 17:38:28
|
I've read that someone had the same problem, but I've already tried the solutions without success. The libraries are in lib/debug/ instead of being in lib/. I don't know if that means anything, but I've seen a reference to debug libraries in the FAQ, and the more information the better. Well, if I can't solve this problem, surely I'll try to build the vxl in linux and see if my computer is cursed or something (it wouldn't be a big surprise really). Thank you |
From: Brad K. <bra...@ki...> - 2005-12-29 17:04:11
|
Quique Fernandez wrote: > Hello. I'm having problems to compile a program. I've checked the > includes to see which libraries I had to link, and I thought that with > vil.lib and vcl.lib would be enough, but I don't know if the problem is > that I need to link against more libraries or that I haven't linked them > correctly. > > I've installed the VXL using cmake and compiling the library with visual > studio.net <http://studio.net>, and visual gave me the same linker errors. [snip] > I'm using DevCpp 4.9.9.2 <http://4.9.9.2>, which uses (I think) gcc > 3.4.2. The operating system is windows xp, and the VXL version is 1.3.0. [snip] > g++.exe cargar.o Cargar_Imagen_private.res -o "Cargar Imagen.exe" > -L"E:/Dev-Cpp/lib" -L"E:/Programacion/VXL/VXLBIN/lib/debug" -lvil -lvcl Did you build VXL with this gcc compiler too or are you just trying to link to the one built with Visual Studio? C++ libraries and the executables that link to them must be built by the same C++ compiler, at least until the distant future when all C++ compiler vendors support the multi-vendor standard ABI. What you are probably seeing is GCC looking for C++ symbols using one name-mangling scheme and the libraries are providing the symbols using a different mangling scheme. Therefore the linker cannot resolve the symbols. Even if it could there is alot more in the C++ ABI than just the name mangling scheme so the program would probably not run anyway. I'm not too familiar with DevCpp but I know CMake does not yet support it. If DevCpp can be configured to use the MinGW version of gcc then you can use CMake's Unix Makefiles generator to build vxl under MinGW and then building your code with DevCpp may work. I don't know if anyone has ever built vxl on MinGW though. -Brad |
From: Miguel A. Figueroa-V. <mi...@ms...> - 2005-12-29 18:06:54
|
Quique Fernandez wrote: > I've installed the VXL using cmake and compiling the library with visual > studio.net <http://studio.net>, and visual gave me the same linker errors. > I've asked a friend who has more experience with the DevC++ environment, > and he doesn't know what's the problem. As Brad King mentioned you need to build the VXL libraries with the same compiler you use to build your code. > The program is: > #include <vcl_iostream.h> > #include <vxl_config.h> > #include <vil/vil_rgb.h> > #include <vil/vil_load.h> > #include <vil/vil_image_view.h> > > int main() > { > // Load image into memory. > vil_image_view<vil_rgb<vxl_byte> > img = vil_load("foo.ppm"); > > // Access pixel (100,100) and print its value as an int. > vcl_cerr << "Pixel 100,100 = ";// << img(100,100) << vcl_endl; > > return 0; > } > > The include directories are the vcl and core subdirectories in the > VXLBIN and VXLSRC > > I'm using DevCpp 4.9.9.2 <http://4.9.9.2>, which uses (I think) gcc > 3.4.2. The operating system is windows xp, and the VXL version is 1.3.0. > > These are the linker errors, all related to functions from the libraries > > [Linker error] undefined reference to `vil_load(char const*)' > [Linker error] undefined reference to `vil_image_view<vil_rgb<unsigned > char> >::vil_image_view(vil_smart_ptr<vil_image_view_base> const&)' > [Linker error] undefined reference to > `vil_smart_ptr<vil_image_view_base>::unref(vil_image_view_base*)' > [Linker error] undefined reference to `vcl_cassert_failure(char const*, > int, char const*)' > [Linker error] undefined reference to > `vil_smart_ptr<vil_memory_chunk>::unref(vil_memory_chunk*)' > [Linker error] undefined reference to `vcl_cassert_failure(char > const*, int, char const*)' > These errors are most probably due to compiling with different libraries, given that the symbols it complains about are in fact part of vil, vcl. I have vxl built with MinGW and with VS.net, both in a windows XP machine. So, this shouldn't be a problem for you. However, it appears that vil, vcl are not enough. In other words after you use the same compiler for both (i.e., VXL and your code) you will likely encounter other undefined symbols due to other libraries (e.g., jpeg, tiff, etc). I copied the code you have there and compiled it with mingw successfully: g++ -c -I"/path/to/vcl" -I"/path/to/core" test.cxx Then I linked to the mingw vxl libs: g++ test.o -L"/path/to/vxl_mingw/lib" -lvil -lvcl but this gives me errors such as: ../vxl_mingw/lib/libvil.a(vil_stream_url.obj)(.text+0xa8a):vil_stream_url.cxx: undefined reference to `WSAStartup@8' ../vxl_mingw/lib/libvil.a(vil_stream_url.obj)(.text+0xab3):vil_stream_url.cxx: undefined reference to `socket@12' ../vxl_mingw/lib/libvil.a(vil_stream_url.obj)(.text+0xadc):vil_stream_url.cxx: undefined reference to `WSAGetL I had to link with all the following to successfully create the executable: g++ test.o -L"/path/to/vxl_mingw/lib" -lvil -lvcl -ljpeg -ltiff -lpng -lz -lws2_32 My suggestion is that you build both VXL and your code, not only with the same compiler, but also with cmake. This way cmake will determine that it needs all the other libraries (i.e., jpeg, tiff, png, z, ws2_32) when you add the vil library. Of course, you can do this manually as I did above, but if you start handling a lot of code it is easier to let CMake take care of the dependencies... Again, I have MinGW and VXL setup in a WinXP machine, if you need help setting these tools up, let me know and I'll guide you through as I can. Hope this helps... --Miguel |
From: Quique F. <qui...@gm...> - 2005-12-30 09:10:12
|
> > > These errors are most probably due to compiling with different > libraries, given that the symbols it complains about are in fact part of > vil, vcl. I have vxl built with MinGW and with VS.net, both in a windows > XP machine. So, this shouldn't be a problem for you. I've finally changed to linux, because I'm not sure that visual had built the vxl libraries correctly, and when windows fails, usually linux have success... I've just compiled the file successfully using the libraries you told me However, it appears that vil, vcl are not enough. In other words after > you use the same compiler for both (i.e., VXL and your code) you will > likely encounter other undefined symbols due to other libraries (e.g., > jpeg, tiff, etc). > > I copied the code you have there and compiled it with mingw successfully: > > g++ -c -I"/path/to/vcl" -I"/path/to/core" test.cxx > > Then I linked to the mingw vxl libs: > > g++ test.o -L"/path/to/vxl_mingw/lib" -lvil -lvcl > > but this gives me errors such as: > > > ../vxl_mingw/lib/libvil.a(vil_stream_url.obj)(.text+0xa8a):vil_stream_url= .cxx: > undefined reference to `WSAStartup@8' > > ../vxl_mingw/lib/libvil.a(vil_stream_url.obj)(.text+0xab3):vil_stream_url= .cxx: > undefined reference to `socket@12' > > ../vxl_mingw/lib/libvil.a(vil_stream_url.obj)(.text+0xadc):vil_stream_url= .cxx: > undefined reference to `WSAGetL > > I had to link with all the following to successfully create the > executable: > > g++ test.o -L"/path/to/vxl_mingw/lib" -lvil -lvcl -ljpeg -ltiff -lpng > -lz -lws2_32 It gave me the same errors until I wrote the aditional libraries. My suggestion is that you build both VXL and your code, not only with > the same compiler, but also with cmake. This way cmake will determine > that it needs all the other libraries (i.e., jpeg, tiff, png, z, ws2_32) > when you add the vil library. Of course, you can do this manually as I > did above, but if you start handling a lot of code it is easier to let > CMake take care of the dependencies... I'm very interested in the compilation with CMake, because I don't know the library very well yet, and I don't know the dependencies between libraries. How can I compile using cmake, so that it takes care of the dependencies? Thank you a lot. I was beginning to hate the library before being able to load an image. xD |
From: Miguel A. Figueroa-V. <mi...@ms...> - 2005-12-30 19:50:12
|
I've replied to the mailing list for archival, but I think this discussion has grown out of VXL scope, so I recommend that if you have any more doubts concerning build tools and CMake, email me off the list. Quique Fernandez wrote: > I've finally changed to linux, because I'm not sure that visual had > built the vxl libraries correctly, and when windows fails, usually linux > have success... I like linux myself, but these days I work mostly in WinXP and Visual Studio 7.0 with the aid of Cygwin, MinGW, XEmacs, and the likes... However, the VXL community has done a very good job with portability (specially with the core libraries) with daily builds and tests for many platforms: http://www.cs.rpi.edu/research/groups/vxl/Testing/Dashboard/MostRecentResults-Nightly/Dashboard.html So, don't be discouraged to use your favorite platform for developing your code... > I'm very interested in the compilation with CMake, because I don't know > the library very well yet, and I don't know the dependencies between > libraries. How can I compile using cmake, so that it takes care of the > dependencies? IMHO, the best way to learn CMake is by example. There are lots of them in the VXL source tree itself. Obviously, you should look at the documentation in the CMake website, and there is also a readonable documentation for VXL online. It includes, the VXL Book (more of a tutorial and introduction) and the Doxygen documentation. However, this site is temporarily offline; it should be up after the holiday break. The very basics of using cmake: 1. Create a CMakeLists.txt file (like a makefile, but with much simpler structure). -- Sample CMakeLists.txt -- PROJECT(image_loader) # where UseVXL.cmake resides in your VXL installation SET(VXL_CMAKE_DIR ${path/to/vxl}/share/vxl/cmake) FIND_PACKAGE(VXL) IF(VXL_FOUND) INCLUDE(${VXL_CMAKE_DIR}/UseVXL.cmake) ELSE(VXL_FOUND) MESSAGE("VXL_DIR should be set to the VXL build directory.") ENDIF(VXL_FOUND) ADD_EXECUTABLE(load_image load_image.cxx) TARGET_LINK_LIBRARIES(load_image vil) -- Sample CMakeLists.txt -- 2. run the gui frontend of cmake (or the command line version) and it will generate the build files for the system you choose. It can generate Visual Studio 6,7,8... files, Borland, Unix Makefiles for use with gcc or the like, etc. Also, I suggest doing an out-of-source build. That is specify a different directory for your build than where the source resides. This way you can delete the build directory at any time without damaging your source. -- Sample command line run -- Assuming: /home/miguelf/source : path to source /home/miguelf/builds : where to build Then: $ cd /home/miguelf/builds $ cmake -G "Unix Makefiles" ../source then regular gnu make: $ make -- Sample command line run -- > Thank you a lot. I was beginning to hate the library before being able > to load an image. xD I'm glad your giving it a try! --Miguel |