Home
Post
Cancel

🚨 문제 상황

macOS에서 Fyne을 사용해 트레이 앱을 개발하던 중 다음과 같은 문제들이 발생했습니다:

1. 앱 실행 문제

  • make run-binary 실행 시 Killed: 9 오류 발생

  • 트레이 아이콘이 메뉴바에 표시되지 않음

  • Dock에도 앱이 나타나지 않음

  • 활성 상태 보기에만 프로세스가 표시됨

  • 앱 강제 종료가 되지 않음

2. 빌드 경고 메시지

# github.com/shinychan95/Chan
ld: warning: ignoring duplicate libraries: '-lobjc'

🔍 원인 분석

환경 차이가 핵심 문제

  • 정상 작동 환경: Go 1.24.4, clang 14.0.3

  • 문제 발생 환경: Go 1.21.10, clang 16.0.0

`lobjc` 경고의 정확한 원인

웹 검색 결과, 이 경고는 Xcode 15의 새로운 링커와 관련이 있습니다:

  1. Xcode 15의 새로운 링커: Apple이 Xcode 15에서 완전히 새로 작성한 링커를 도입했습니다. 이전의 ld64를 대체하는 새로운 ld 링커입니다.

  2. 새로운 경고 플래그: 새 링커는 기본적으로 warn_duplicate_libraries 플래그가 활성화되어 있어, 중복된 라이브러리 링크에 대해 경고를 표시합니다.

  3. CGO와 Objective-C의 중복 링킹: Go Issue #67799에 따르면, 2개 이상의 CGO 패키지가 Objective-C 코드를 포함할 때 libobjc 라이브러리가 중복으로 링크되는 문제가 있습니다.

  4. 환경별 차이: clang 14.0.3 vs 16.0.0의 차이로 인해 일부 환경에서는 경고가 나타나지 않을 수 있습니다.

✅ 해결 방법

1. Go 버전 업그레이드 (핵심 해결책)

Homebrew를 사용한 Go 업그레이드:

# 현재 Go 버전 확인
go version

# Homebrew로 최신 Go 설치
brew install go

# PATH 업데이트 (현재 세션)
export PATH="/opt/homebrew/bin:$PATH"

# 영구 적용 (zsh 사용자)
echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshrc

# 버전 확인
go version  # go version go1.24.4 darwin/arm64

2. 백그라운드 모드 활성화

macOS에서 트레이 전용 앱이 제대로 동작하려면 NSApplication을 Accessory 모드로 설정해야 합니다:

/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Cocoa
#import <Cocoa/Cocoa.h>

void forceAccessoryModeEarly() {
    NSApplication *app = [NSApplication sharedApplication];
    [app setActivationPolicy:NSApplicationActivationPolicyAccessory];
}
*/
import "C"

func main() {
    // macOS에서 NSApplication 생성과 동시에 즉시 Accessory 모드 적용
    switch runtime.GOOS {
    case "darwin":
        C.forceAccessoryModeEarly() // 핵심 해결책
    }

    // Fyne 앱 초기화
    fyneApp = app.NewWithID("com.example.app")
    // ... 나머지 코드
}

3. 트레이 아이콘 설정

// 트레이 아이콘 설정
if desk, ok := fyneApp.(desktop.App); ok {
    desk.SetSystemTrayIcon(resourceIcon)
}

// 설정 로드 후 트레이 메뉴 설정
loadConfiguration()
refreshTrayMenu()

// 앱 실행
fyneApp.Run()

4. `lobjc` 경고 해결 방법 (선택사항)

경고를 없애고 싶다면 링커 플래그를 추가할 수 있습니다:

# Makefile에 추가
CGO_LDFLAGS += -Wl,-no_warn_duplicate_libraries

# 또는 환경변수로
export CGO_LDFLAGS="-Wl,-no_warn_duplicate_libraries"

주의: 이 플래그는 Xcode 15 이상에서만 지원되므로, 이전 버전과의 호환성을 고려해야 합니다.

📊 결과

Before (문제 상황)

  • Go 1.21.10

  • 트레이 아이콘 표시 안됨 ❌

  • 앱 강제 종료 불가 ❌

  • Killed: 9 오류 ❌

  • lobjc 경고 없음 (환경에 따라)

After (해결 후)

  • Go 1.24.4 ✅

  • 트레이 아이콘 정상 표시 ✅

  • 메뉴바에서 정상 동작 ✅

  • 안정적인 앱 실행 ✅

  • lobjc 경고 발생 (기능상 문제없음)

💡 핵심 교훈

  1. Go 버전 호환성이 중요: 특히 CGO를 사용하는 프로젝트에서는 Go 버전 차이가 큰 영향을 미칠 수 있습니다.

  2. Xcode 15의 새로운 링커: Apple의 새로운 링커는 더 엄격한 검사를 수행하여 이전에는 보이지 않던 경고들이 나타날 수 있습니다.

  3. 환경 일치의 중요성: 개발 환경과 배포 환경의 일치가 중요합니다.

  4. macOS 트레이 앱 개발 시 주의사항:

    • NSApplicationActivationPolicyAccessory 설정 필수

    • CGO와 Objective-C 프레임워크 사용 시 버전 호환성 확인 필요

🔗 참고 자료

This post is licensed under CC BY 4.0 by the author.
Trending Tags
Contents

개발자를 위한 MacOS App 한번 만들어보죠

-

Trending Tags