Как вы связываете dylib в macOS с clang (например, libjpeg)? - PullRequest
0 голосов
/ 23 февраля 2020

Я компилирую программу, которая должна ссылаться на libjpeg в macOS.

Computer:src user$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/splat.dir/itwom3.0.c.o CMakeFiles/splat.dir/splat.cpp.o  -o splat  -lbz2 /opt/local/lib/libpng.dylib /opt/local/lib/libz.dylib /opt/local/lib/libjpeg.dylib

Однако при связывании я получаю неопределенные ошибки символов:

Undefined symbols for architecture x86_64:
  "jpeg_std_error(jpeg_error_mgr*)", referenced from:
  ImageWriterInit(ImageWriter_st*, char const*, ImageType, int, int) in splat.cpp.o

Символ делает существует в рассматриваемой библиотеке:

Computer:src user$ nm -a /opt/local/lib/libjpeg.dylib | grep jpeg_std_error
0000000000017584 T _jpeg_std_error

Есть ли что-то очевидное, что я делаю неправильно?

1 Ответ

1 голос
/ 23 февраля 2020

Тот факт, что имя символа в ошибке включает информацию о типе (типы аргументов), показывает, что это искаженный символ C ++. libjpeg не предоставляет этот символ, он только предоставляет символ C. Другими словами jpeg_std_error(jpeg_error_mgr*)! = _jpeg_std_error.

Это говорит о том, что вам необходимо заключить #include заголовков libjpeg в extern "C" { ... }.

...