macOSM1 处理器上的虚假 ld 错误

问题描述

我有一个使用 libcairo 的 C 项目。在我的英特尔 Mac 上,使用附加脚本编译 Cairo 会生成一个 x86_64 静态库,可以毫无问题地使用。

在 M1 Mac(Mac mini,虽然我怀疑这是一个因素)上,我确保在任何地方都设置 -arch x86_64输出二进制文件在 Intel 上使用)。 Cairo 构建成功并生成一个静态库。但是,在构建依赖它的程序时,我在链接阶段收到以下错误消息:

ld: warning: ignoring file (...)/lib/libcairo.a,building for macOS-x86_64 but attempting to link with file built for macOS-x86_64
Undefined symbols for architecture x86_64:
  "_cairo_create",referenced from:
      _av_display_new in libavionics.a(display.c.o)
  (...)

我已确保在 CMake 中将 CMAKE_OSX_ARCHITECTURES 标志设置为 x86_64。我可以通过在 Xcode 中创建一个虚拟项目并为 x86_64 构建来复制这个问题。一个使用 freetype2 的虚拟项目(使用相同的方法构建),构建和运行没有错误。鉴于错误消息表明架构不匹配(但都是 macOS-x86_64

lipo -info libcairo.a 返回 Non-fat file: libcairo.a is architecture: x86_64

我的开罗构建脚本如下:

CAIRO_CONFOPTS_COMMON="--enable-static --disable-egl --disable-glesv2 \
    --disable-glesv3 --disable-glx --disable-gl --disable-valgrind \
    --disable-xlib --enable-ft --disable-shared --disable-xlib-xrender \
    --disable-xcb --disable-svg --disable-full-testing --disable-interpreter \
    --disable-gallium --disable-beos --disable-cogl --disable-directfb \
    --disable-fc --disable-ps --disable-glesv2 --disable-win32 \
    --disable-win32-font --disable-drm --disable-png --disable-script --disable-quartz \
    --disable-wgl --disable-gobject --disable-trace --disable-symbol-lookup --disable-zlib"


ARCH_FLAGS="-arch\\ x86_64\\ -mmacosx-version-min=10.9"

export GNUMAKEFLAGS=--no-print-directory
cd cairo
# Make sure we use the libraries we built,and not the system ones
export pixman_CFLAGS="-I$OUTDIR/include/pixman-1"
export pixman_LIBS="$OUTDIR/lib/libpixman-1.a"
export FREETYPE_CFLAGS="-I$OUTDIR/include/freetype2"
export FREETYPE_LIBS="$OUTDIR/lib/libfreetype.a"
export PKG_CONfig_PATH="$OUTDIR/lib/pkgconfig"

eval LDFAGS="-fvisibility=hidden\\ $ARCH_FLAGS" \
    CFLAGS="-fvisibility=hidden\\ $ARCH_FLAGS" \
    CXXFLAGS="-fvisibility=hidden\\ $ARCH_FLAGS" \
    ./configure --prefix=$OUTDIR $CAIRO_CONFOPTS_COMMON $ADDCONF || exit 1
make -j9 || exit 1
make install || exit 1

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)