🚨 문제 상황
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의 새로운 링커와 관련이 있습니다:
Xcode 15의 새로운 링커: Apple이 Xcode 15에서 완전히 새로 작성한 링커를 도입했습니다. 이전의
ld64를 대체하는 새로운ld링커입니다.새로운 경고 플래그: 새 링커는 기본적으로
warn_duplicate_libraries플래그가 활성화되어 있어, 중복된 라이브러리 링크에 대해 경고를 표시합니다.CGO와 Objective-C의 중복 링킹: Go Issue #67799에 따르면, 2개 이상의 CGO 패키지가 Objective-C 코드를 포함할 때
libobjc라이브러리가 중복으로 링크되는 문제가 있습니다.환경별 차이: 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경고 발생 (기능상 문제없음)
💡 핵심 교훈
Go 버전 호환성이 중요: 특히 CGO를 사용하는 프로젝트에서는 Go 버전 차이가 큰 영향을 미칠 수 있습니다.
Xcode 15의 새로운 링커: Apple의 새로운 링커는 더 엄격한 검사를 수행하여 이전에는 보이지 않던 경고들이 나타날 수 있습니다.
환경 일치의 중요성: 개발 환경과 배포 환경의 일치가 중요합니다.
macOS 트레이 앱 개발 시 주의사항:
NSApplicationActivationPolicyAccessory 설정 필수
CGO와 Objective-C 프레임워크 사용 시 버전 호환성 확인 필요