首页 > 解决方案 > 如何将 macOS 上的 dylib 与 clang(例如 libjpeg)链接?

问题描述

我正在编译一个需要在 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

但是,在链接期间,我得到未定义的符号错误:

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

有什么明显的我做错了吗?

标签: macosclangdylib

解决方案


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

这表明您需要将您#include的 libjpeg 标头包含在extern "C" { ... }.


推荐阅读