你如何在 macOS 上使用 clang link dylib(例如 libjpeg)?

How do you link a dylib on macOS with clang (libjpeg for example)?

我正在编译一个程序,需要 link 针对 macOS 上的 libjpeg。

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

但是,在 linking 期间,我收到未定义的符号错误:

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

有什么明显的错误吗?

错误中的符号名称包含类型信息(参数类型)这一事实表明它是一个错位的 C++ 符号。 libjpeg 不提供该符号,它只提供 C 符号。换句话说 jpeg_std_error(jpeg_error_mgr*) != _jpeg_std_error.

这表明您需要将 libjpeg headers 的 #include 包围在 extern "C" { ... } 中。