Company of Heroes 2 Keeps Crashing Mid-Match on Mac? Here's the Fix
- Company of Heroes 2
- CoH2
- Mac Gaming
- macOS Tahoe
- Apple Silicon
- Rosetta
If you’ve tried to play Company of Heroes 2 multiplayer on a modern Mac and watched the game die mid-match with no way to resume, you’re likely as upset as I was.
Don’t worry. That was the last time it’ll happen.
Eager to get back to war? Just give me the recipe.
Same story here on an M3 Pro running macOS Tahoe: one crash each player in a private match, game over, squad ready to switch games. It wasn’t “Macs can’t run games.” The game’s old Mac audio library breaks under Tahoe. When you’re deep in a fight, that library gets hammered, and eventually the whole process dies.
Two hours of uninterrupted multiplayer later, the fix held for both of us. Here’s the short version of what went wrong, what the patch does, and how to apply it yourself.
What goes wrong
CoH2 on Mac is Feral Interactive’s Intel port of the game. On Apple Silicon it runs through Apple’s translation layer.
Mid-match, the crash always pointed at the same place: the system audio library the game still uses. Apple stopped maintaining that library years ago. On Tahoe it falls over for translated games, and CoH2 is one of them. Other older Mac ports that lean on the same audio stack have hit the same class of failure.
The fix (in plain terms)
You swap that broken system audio library for a maintained replacement, then tell CoH2 to load the replacement instead.
That’s all the Terminal script below does:
- Builds the replacement once (Mac may ask you to install developer tools on the first run).
- Points the game at it.
- Re-approves the app so macOS will still launch it.
Your saves are safe. Preferences and save data live outside the Steam app, under ~/Library/Application Support/Feral Interactive/Company of Heroes 2/. The script only edits the game binary inside the app.
If something goes wrong: in Steam, open Properties → Installed Files → Verify integrity of game files (or reinstall). That restores the stock game. The replacement library lives in ~/.local/, so Verify won’t delete it. Just re-run the script afterward to hook it up again.
One-shot installer (quit CoH2 first)
First run needs a short network download and, if you’ve never installed them, Apple’s Command Line Tools (macOS will prompt).
Quit CoH2, then copy the script below and paste it into Terminal:
set -euo pipefail
cd "$HOME"
APP="$HOME/Library/Application Support/Steam/steamapps/common/Company of Heroes 2/Company of Heroes 2.app"
BIN="$APP/Contents/MacOS/Company of Heroes 2"
PREFIX="$HOME/.local/openal-soft-x86_64"
OPENAL="$PREFIX/lib/libopenal.1.dylib"
APPLE_OPENAL="/System/Library/Frameworks/OpenAL.framework/Versions/A/OpenAL"
SOFT_VER="1.24.3"
CMAKE_VER="3.31.6"
fail() { echo "FAILED: $*" >&2; exit 1; }
if pgrep -f 'Company of Heroes 2.app/Contents/MacOS/Company of Heroes 2' >/dev/null; then
fail "Quit Company of Heroes 2 first, then re-run."
fi
[[ -x "$BIN" ]] || fail "CoH2 not found at: $BIN"
if otool -L "$BIN" | grep -q 'openal-soft-x86_64/lib/libopenal'; then
echo "Already patched. Nothing to do."
exit 0
fi
if ! xcode-select -p >/dev/null 2>&1; then
xcode-select --install || true
fail "Install Xcode Command Line Tools from the popup, then re-run this script."
fi
mkdir -p "$PREFIX"
# Use cmake on PATH, otherwise download a portable Kitware build
if command -v cmake >/dev/null 2>&1; then
CMAKE=(cmake)
else
CMAKE_BIN="$PREFIX/cmake/CMake.app/Contents/bin/cmake"
if [[ ! -x "$CMAKE_BIN" ]]; then
echo "Downloading CMake $CMAKE_VER…"
curl -fsSL "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VER}/cmake-${CMAKE_VER}-macos-universal.tar.gz" \
| tar -xz -C "$PREFIX"
rm -rf "$PREFIX/cmake"
mv "$PREFIX/cmake-${CMAKE_VER}-macos-universal" "$PREFIX/cmake"
fi
[[ -x "$CMAKE_BIN" ]] || fail "Could not install CMake"
CMAKE=("$CMAKE_BIN")
fi
# Build Soft once; reuse after Steam Verify → re-apply
if [[ ! -f "$OPENAL" ]]; then
SRC="$PREFIX/openal-soft-${SOFT_VER}"
if [[ ! -f "$SRC/CMakeLists.txt" ]]; then
echo "Downloading OpenAL Soft $SOFT_VER…"
curl -fsSL "https://github.com/kcat/openal-soft/archive/refs/tags/${SOFT_VER}.tar.gz" \
| tar -xz -C "$PREFIX"
fi
echo "Building OpenAL Soft (x86_64)…"
rm -rf "$SRC/build-x86"
"${CMAKE[@]}" -S "$SRC" -B "$SRC/build-x86" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="$PREFIX" \
-DCMAKE_OSX_ARCHITECTURES=x86_64 \
-DCMAKE_IGNORE_PREFIX_PATH=/opt/homebrew \
-DALSOFT_EXAMPLES=OFF \
-DALSOFT_UTILS=OFF
"${CMAKE[@]}" --build "$SRC/build-x86" -j"$(sysctl -n hw.ncpu)"
"${CMAKE[@]}" --install "$SRC/build-x86"
fi
[[ -f "$OPENAL" ]] || fail "OpenAL Soft dylib missing at $OPENAL"
install_name_tool -id "$OPENAL" "$OPENAL"
codesign --force --sign - "$OPENAL"
codesign -d --entitlements :- "$BIN" > "$PREFIX/coh2.entitlements" 2>/dev/null || true
install_name_tool -change "$APPLE_OPENAL" "$OPENAL" "$BIN"
xattr -cr "$APP" 2>/dev/null || true
if [[ -s "$PREFIX/coh2.entitlements" ]]; then
codesign --force --sign - --entitlements "$PREFIX/coh2.entitlements" "$BIN"
else
codesign --force --sign - "$BIN"
fi
codesign --force --sign - "$APP"
if otool -L "$BIN" | grep -q 'openal-soft-x86_64/lib/libopenal'; then
echo "SUCCESS: CoH2 is linked to OpenAL Soft. Launch it from Steam."
exit 0
fi
fail "Patch did not stick. Email [email protected] with this output:"
otool -L "$BIN" | grep -i openal || trueThe script prints SUCCESS or FAILED.
Extra tips
- After Steam Verify integrity (or a game update), the stock game comes back. Re-run the script. You shouldn’t need to rebuild anything.
- Mac and Linux can play each other. Neither can play with Windows. Keep lobbies Mac/Linux-only.
If the launcher dies once
Sometimes the first launch crashes before you even reach a match. That’s a different audio hiccup, not the mid-match bug this patch fixes. It’s intermittent. Launch again and you should get through.
Result
Before: mid-match crash, lobby dead, no resume.
After: a full multiplayer game with a friend on the same patch: 2+ hours, no mid-match drop.
If this gets you back into CoH2 on Mac, tell another Mac player. The Mac/Linux crowd is small enough that every stable lobby helps.
Questions, a weird crash, or a lobby that still gets mortared? Email [email protected].