RenderKit / embree

Embree ray tracing kernels repository.
Apache License 2.0
2.35k stars 385 forks source link

Symbols not found when linking to libjpeg on OS X #29

Closed jansegre closed 9 years ago

jansegre commented 9 years ago

This is what I get on a straight forward compilation attempt on OS X.

I went full verbose and got as far as:

Apple LLVM version 6.0 (clang-600.0.45.3) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
 "/Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.7.0 -o ../../tutorial00 -lcrt1.10.6.o -search_paths_first -headerpad_max_install_names CMakeFiles/tutorial00.dir/tutorial00.cpp.o CMakeFiles/tutorial00.dir/tutorial00_device.cpp.o ../../libembree.2.4.0.dylib ../../libtutorial.a ../../libimage.a ../../libtransport.a ../../libtutorial_device.a ../../libembree_sse41.a ../../libembree_sse42.a ../../libembree_avx.a ../../libembree_avx2.a ../../libsimd.a ../../liblexers.a -framework AGL -framework OpenGL -framework GLUT -framework Cocoa /usr/local/lib/libjpeg.dylib /opt/local/lib/libHalf.dylib /opt/local/lib/libIex.dylib /opt/local/lib/libImath.dylib /opt/local/lib/libIlmImf.dylib /opt/local/lib/libIlmThread.dylib ../../libsys.a -lc++ -lSystem /Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/6.0/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
  "jpeg_std_error(jpeg_error_mgr*)", referenced from:
      embree::loadJPEG(embree::FileName const&) in libimage.a(jpeg.cpp.o)
      embree::storeJPEG(embree::Ref<embree::Image> const&, embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_stdio_src(jpeg_decompress_struct*, __sFILE*)", referenced from:
      embree::loadJPEG(embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_stdio_dest(jpeg_compress_struct*, __sFILE*)", referenced from:
      embree::storeJPEG(embree::Ref<embree::Image> const&, embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_read_header(jpeg_decompress_struct*, int)", referenced from:
      embree::loadJPEG(embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_set_defaults(jpeg_compress_struct*)", referenced from:
      embree::storeJPEG(embree::Ref<embree::Image> const&, embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_CreateCompress(jpeg_compress_struct*, int, unsigned long)", referenced from:
      embree::storeJPEG(embree::Ref<embree::Image> const&, embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_read_scanlines(jpeg_decompress_struct*, unsigned char**, unsigned int)", referenced from:
      embree::decompress(jpeg_decompress_struct*) in libimage.a(jpeg.cpp.o)
  "jpeg_start_compress(jpeg_compress_struct*, int)", referenced from:
      embree::compress(jpeg_compress_struct*, unsigned char*) in libimage.a(jpeg.cpp.o)
      embree::storeJPEG(embree::Ref<embree::Image> const&, embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_finish_compress(jpeg_compress_struct*)", referenced from:
      embree::compress(jpeg_compress_struct*, unsigned char*) in libimage.a(jpeg.cpp.o)
      embree::storeJPEG(embree::Ref<embree::Image> const&, embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_write_scanlines(jpeg_compress_struct*, unsigned char**, unsigned int)", referenced from:
      embree::compress(jpeg_compress_struct*, unsigned char*) in libimage.a(jpeg.cpp.o)
      embree::storeJPEG(embree::Ref<embree::Image> const&, embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_CreateDecompress(jpeg_decompress_struct*, int, unsigned long)", referenced from:
      embree::loadJPEG(embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_destroy_compress(jpeg_compress_struct*)", referenced from:
      embree::storeJPEG(embree::Ref<embree::Image> const&, embree::FileName const&) in libimage.a(jpeg.cpp.o)
  "jpeg_start_decompress(jpeg_decompress_struct*)", referenced from:
      embree::decompress(jpeg_decompress_struct*) in libimage.a(jpeg.cpp.o)
  "jpeg_finish_decompress(jpeg_decompress_struct*)", referenced from:
      embree::decompress(jpeg_decompress_struct*) in libimage.a(jpeg.cpp.o)
  "jpeg_destroy_decompress(jpeg_decompress_struct*)", referenced from:
      embree::loadJPEG(embree::FileName const&) in libimage.a(jpeg.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

I use homebrew, I also checked my libjpeg.dylib:

nm /usr/local/lib/libjpeg.dylib | grep jpeg_std_error
0000000000017884 T _jpeg_std_error

I was able to compile ospray with no issue, which means that I must have the correct dependencies.

I also checked that the arch is correct, even if it wasn't the error would be different.

I can't tell for sure that I don't have an issue on my environment, but I'm running out of ideas on what to test, I mean, the lib is there and it has the symbols, why won't it link? Is there maybe a mangling issue with ispc or something?

svenwoop commented 9 years ago

I was just trying out Embree v2.4 with gcc (clang 6 based) and do not see that issue. However, on my machine linking is performed using g++ and not Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld.

Are you using an unmodified version of Embree v2.4?

You can also disable the JPEG support in cmake to work around the link issue.

jansegre commented 9 years ago

Yes I'm building unmodified version of Embree v2.4. I thought I wasn't because I was on master, but v2.4 branch and master are at the same commit (584545...).

I could build when disabling JPEG, I don't mind, but still, it's odd.