我有一个使用 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