별자리 운세나 성격 테스트 결과를 보며 "어떻게 내 성격을 이렇게 잘 맞췄지?"라고 놀랐던 적이 있나요? 하지만 조금만 더 생각해 보면, 그 내용이 누구에게나 적용될 수 있는 일반적인 표현임을 알게 됩니다. 바로 이 현상을 바넘 효과(Barnum Effect)라고 부릅니다. 이는 사람들이 자신에게 맞지 않는 일반적이고 모호한 진술도 자신과 관련이 있다고 믿는 심리학적 현상입니다.


바넘 효과란?

바넘 효과는 심리학자 폴 밀(Paul Meehl)이 1956년 처음 명명했으며, 심리학적 평가나 점성술, 심리 테스트 등에서 자주 관찰됩니다. 이 이름은 "모든 사람에게 무언가를 제공할 수 있다"는 의미로 서커스 운영자인 P.T. 바넘(P.T. Barnum)에서 따왔습니다.

이 현상은 사람들이 일반적이고 모호한 진술을 자신에게 맞는 개인화된 진술로 받아들이는 경향을 설명합니다. 예를 들어, "당신은 가끔 외향적이지만, 때로는 혼자 있는 시간을 즐깁니다"와 같은 표현은 누구에게나 해당될 수 있지만, 사람들은 이를 자신에게 정확히 맞는 설명이라고 믿을 가능성이 큽니다.

 


바넘 효과의 작동 원리

  1. 개인화의 욕구 사람들은 자신이 특별하고 독특하다는 느낌을 받고 싶어 합니다. 따라서 모호한 진술이라도 자신과 연결 짓고 이를 개인적으로 받아들이는 경향이 있습니다.
  2. 확증 편향 사람들은 자신이 이미 믿고 있는 것을 강화하는 정보에 집중하는 경향이 있습니다. 따라서 바넘 효과로 인해 나온 진술에서 자신과 일치하는 부분을 찾아 이를 사실로 받아들입니다.
  3. 모호성 모호한 진술은 여러 상황이나 성격에 적용될 수 있기 때문에, 사람들은 이를 자신에게 맞게 해석합니다.

바넘 효과의 실제 사례

  1. 별자리 운세 "이번 주에 당신은 중요한 결정을 내려야 할 수도 있습니다." 별자리 운세는 대부분의 사람들이 공감할 수 있는 일반적인 문구로 구성되어 있습니다. 하지만 사람들은 이를 자신만을 위한 메시지로 받아들입니다.
  2. 심리 테스트 온라인에서 흔히 볼 수 있는 성격 테스트는 바넘 효과를 이용하여 결과를 개인적으로 느끼게 만듭니다. 이로 인해 테스트를 신뢰하게 되고, 때로는 돈을 지불하며 심층 분석을 요청하기도 합니다.
  3. 점술 및 타로 점술사나 타로 리더는 일반적인 진술을 사용하여 고객이 이를 자신과 관련 있다고 믿게 합니다. 이 과정에서 고객은 자신의 상황에 맞게 진술을 해석하며 놀라움을 느낍니다.

바넘 효과를 극복하는 방법

  1. 비판적 사고 기르기 모호하거나 일반적인 진술에 대해 비판적으로 생각하고, 그것이 진짜로 나에게만 해당되는 것인지 검토해야 합니다.
  2. 구체적 근거 요구하기 개인화된 정보를 제공한다고 주장하는 경우, 구체적인 증거나 데이터를 요구해야 합니다. 이를 통해 진술의 신뢰성을 평가할 수 있습니다.
  3. 확증 편향 인식하기 자신이 이미 믿고 있는 정보를 강화하려는 경향을 인식하고, 객관적인 시각에서 판단하려는 노력이 필요합니다.

결론

바넘 효과는 사람들이 자신을 이해하고자 하는 욕구와 모호한 진술의 힘이 결합되어 나타나는 심리적 현상입니다. 이를 이해하면 별자리 운세나 심리 테스트와 같은 일상적인 경험을 더 객관적으로 바라볼 수 있습니다. 우리 모두는 자신이 특별하다는 느낌을 받고 싶어 하지만, 그것이 진정한 개인화된 정보인지 비판적으로 살펴보는 것이 중요합니다. 당신은 지금 이 순간, 얼마나 바넘 효과의 영향을 받고 있을까요?

반응형

우리는 모두 한 번쯤 "내가 생각보다 잘 못하는구나"라는 깨달음을 경험했을 것입니다. 더닝-크루거 효과(Dunning-Kruger Effect)는 이와 같은 현상을 체계적으로 설명하는 심리학 이론으로, 사람들이 자신의 능력을 과대평가하거나 과소평가하는 경향을 탐구합니다. 이 효과는 심리학자 데이비드 더닝(David Dunning)과 저스틴 크루거(Justin Kruger)가 1999년 발표한 연구에서 유래했습니다.

 


더닝-크루거 효과란?

더닝-크루거 효과는 역량이 부족한 사람들이 자신의 능력을 실제보다 과대평가하는 동시에, 역량이 높은 사람들은 자신의 능력을 과소평가하는 경향이 있다는 이론입니다.

 


왜 발생할까?

더닝-크루거 효과는 자기 인식과 메타인지 능력의 부족에서 기인합니다. 메타인지는 "내가 무엇을 알고 있는지"를 아는 능력으로, 이는 자신의 한계를 평가하는 데 필수적입니다. 역량이 부족한 사람은 이 메타인지 능력 또한 부족하기 때문에 자신의 부족함을 깨닫기 어렵습니다.

또한, 사회적 비교와 자존감 유지 욕구도 이 효과를 강화시킬 수 있습니다. 사람들은 자신을 긍정적으로 평가하려는 경향이 있기 때문에 자신의 부족함을 인정하기 어려워합니다.

 


학사: 내가 뭘 아는지 알겠다.
석사: 내가 뭘 모르는지 알겠다.
박사: 내가 뭘 아는지 모르겠다.
교수: 거짓말을 해도 다들 믿는다.


결론

더닝-크루거 효과는 우리 모두에게 적용될 수 있는 심리적 편향입니다. 자신의 능력을 과대평가하거나 과소평가하는 함정에 빠지지 않으려면 지속적인 학습과 자기 성찰이 필요합니다. 이 효과를 이해하고 극복하는 것은 개인의 성장뿐만 아니라 팀과 조직의 성공에도 큰 영향을 미칠 수 있습니다. 당신은 오늘 자신의 능력을 어떻게 평가하고 있나요?

반응형

효율적인 팀워크를 위해 얼마나 많은 사람들이 적절할까요? 아마존 창립자제프 베이조스는 이에 대한 간단한 규칙을 제안했습니다. 바로 "피자 두 판의 법칙(Two-Pizza Rule)"입니다. 한 팀이 피자 두 판으로 충분히 배를 채울 수 있을 정도로 작아야 한다는 이 법칙은 작은 팀효율적이고 생산적이라는 아이디어를 중심으로 합니다.


피자 두 판의 법칙이란?

피자 두 판의 법칙은 팀의 크기가 너무 크면 의사소통이 복잡해지고, 협업의 효율성이 떨어질 수 있다는 통찰에서 비롯되었습니다. 피자 두 판으로 만족할 수 있는 인원, 보통 6~8명을 넘지 않는 규모가 가장 이상적이라고 말합니다. 팀이 작을수록 각 구성원이 더 많은 책임과 주도권을 가질 수 있으며, 의사결정 과정이 간소화되어 빠르고 유연한 실행이 가능해집니다.


왜 작은 팀이 효과적인가?

  1. 효율적인 의사소통 큰 팀은 의견 조율과 정보 공유에 많은 시간을 소비합니다. 반면, 작은 팀은 구성원 간의 소통이 원활하고 신속하여 빠른 결정을 내릴 수 있습니다.
  2. 책임감과 참여도 작은 팀에서는 각 구성원이 자신의 역할에 대한 책임감을 더 많이 느낍니다. 이는 팀의 목표를 향한 높은 몰입도와 주도성을 유발합니다.
  3. 유연성과 창의성 작은 팀은 변화에 신속하게 대응할 수 있는 유연성을 가지고 있습니다. 각 구성원이 더 많은 기여를 할 수 있는 환경이 창의적인 아이디어를 촉진합니다.


한계와 고려 사항

물론 모든 상황에서 피자 두 판의 법칙이 완벽한 해결책이 되는 것은 아닙니다. 어떤 프로젝트는 본질적으로 더 많은 사람의 참여가 필요할 수도 있습니다. 또한, 팀의 크기만큼 중요한 것은 팀원들의 기술과 협업 능력입니다. 소규모 팀이라도 적절한 역량과 상호 신뢰가 없다면 성공을 보장할 수 없습니다.


결론

피자 두 판의 법칙은 단순하지만 강력한 메시지를 전달합니다. 팀은 작을수록 집중력과 효율성이 높아질 가능성이 큽니다. 하지만 이 법칙을 실현하려면 단순히 팀의 크기를 줄이는 것을 넘어, 팀원들의 역량과 협력의 질을 함께 고려해야 합니다.

작고 강력한 팀이 큰 목표를 달성하는 데 얼마나 효과적인지 보여주는 피자 두 판의 법칙은 오늘날 다양한 조직과 프로젝트에서 여전히 유효한 지침으로 자리 잡고 있습니다. 당신의 팀은 과연 피자 두 판으로 만족할 수 있을 만큼 효율적인가요?

 

참고

 

성과 좋은 조직 - Amazon 2-피자 팀 | AWS Executive Insights

Amazon과 AWS에는 다양한 글쓰기가 있습니다. 역방향으로 작업 방식의 산물인 PR/FAQ(보도 자료/자주 묻는 질문의 약자) 문서가 있으며 그중 일부는 신제품 출시에 초점을 맞추고 있습니다. 팀이 비

aws.amazon.com

 

반응형

어느 날, 오래된 건물의 유리창 하나가 깨졌다고 상상해보세요. 아무도 그것을 수리하지 않습니다. 사람들은 이 작은 파손을 보고 건물이 방치되었다고 생각하고, 더 많은 리창이 깨지기 시작합니다. 언젠가 건물 전체가 황폐지고, 그 주변에는 더 큰 무질서가 자리 잡습니다. 깨진 유리창 이론은 바로 이런 사소한 변화가 가져오는 큰 결과를 이야기합니다.

 

작은 행동의 중요성

1982년 제임스 Q. 윌슨과 조지 L. 켈링은 깨진 유리창 이론을 통해 환경이 사람들의 행동에 미치는 영향을 강조했습니다. 작은 문제를 방치하면 무질서가 확산되지만, 이를 바로잡으면 질서가 유지됩니다. 이 단순한 개념은 우리 삶에도 적용됩니다. 사소한 문제를 무시하지 않는 것이 중요합니다.

 

뉴욕의 사례

1990년대 뉴욕은 이 이론을 실천한 대표적 사례입니다. 무임승차, 낙서 같은 경미한 범죄를 단속하며 범죄율이 크게 줄었습니다. 물론 경제 회복 등 다른 요인도 있었겠지만, 작은 문제를 해결하는 노력이 도시 전체에 긍정적인 영향을 미쳤다는 점은 분명합니다.

 

우리 주변의 깨진 유리창

쓰레기가 방치된 공터, 사소한 규칙 위반, 무심코 내뱉는 불친절한 말 한마디까지, 우리 주변의 작은 무질서는 어디에나 있습니다. 이를 방치하면 더 큰 문제로 이어질 수 있음을 기억해야 합니다.

조직이나 교실에서도 비슷한 일이 일어납니다. 작은 무질서를 바로잡는 것이 신뢰와 질서를 유지하는 데 필수적입니다.

 

결론

깨진 유리창 이론은 작은 문제를 무시하지 말라고 말합니다. 사소한 노력들이 모여 큰 변화를 만듭니다. 동시에 이를 실행할 때는 공정함과 사람들의 존엄을 지키는 것도 중요합니다.

 

작은 것들을 바로잡는 것이 큰 평화와 질서를 만듭니다. 오늘 당신은 어떤 깨진 유리창을 수리할 것인가요?

반응형

 

Unity Search는 각종 파일(씬, 어셋, 리소스)과 오브젝트, 다양한 것들을 (설정, 메뉴, 패키지, 정적 API, 프리셋) 쉽게 찾을 수 있는 도구이다.

(Unity 21.1부터 에디터에서 기본으로 제공, 이전 버전에선 Quick Search 패키지 형태로 제공)

| Search Window

우선 검색을 실행하려면 아래 방법 중 하나를 통해 검색 Window를 활성화할 수 있다.

  • 에디터 상단 메뉴 > Windows > Search > New Window
  • 에디터 상단 메뉴 > Edit > Search All
  • Ctrl + K 단축키
  • Hierarchy / Project 윈도우 > 검색 버튼

 

A
검색 필드
여기에 검색 쿼리를 입력 또는 검색 토글을 추가
B
저장된 검색
검색 쿼리 및 컬럼을 어셋 형태로 저장할 수 있고, 검색 아이콘 을 클릭하여, 창을 표시 또는 숨길 수 있다. 검색 내용을 저장하려면 검색 필드 오른쪽 Save 아이콘을 클릭
C
검색 결과
검색 쿼리에 해당하는 검색 결과가 표시
D
결과 탭
 
E
인스펙터
선택한 오브젝트의 인스펙터가 제공됨 (인스펙터 아이콘 을 클릭)
F
뷰 및 환경설정
검색 결과 뷰를 변경할 수 있고, 설정 창을 열 수 있다. (리스트 / 그리드 / 테이블 뷰)

 

| 검색 쿼리

대표사진 삭제

검색 쿼리는 기존Hierarchy / Project 에디터의 그것과 유사한 문법을 가진다.

(e.g. t: 어셋타입명, b: 번들 라벨명)

 

 

각각 Project, Hierarchy의 검색 필터 목록

물론 훨씬 더 다양한 형태의 필터를 제공한다.

  • 컴포넌트 타입 포함 여부
  • 번들 라벨
  • 이름 / 파일 수정일자 / 디렉토리 / 확장자 / 파일 사이즈
  • 하이라키 필터 (Visible / Hidden, Root / Leaf, Static, Prefab 등등)
  • 라벨
  • 프리팹 (Variant, Modified, Root 등등)
  • 태그 및 레이어
  • Missing 프리팹 / 어셋 / 스크립트 등
  • 참조 (어셋, 오브젝트)
  • 특정 컴포넌트의 프로퍼티

 

| 인덱스 매니저

기본적으로 Assets로 명명된 기본 인덱스를 가진다.

기본적으로 어셋, 오브젝트, 키워드 등의 엘리먼트를 모두 포함하는 형태이기 때문에 대용량의 대규모의 프로젝트의 경우에 검색에 필요한 별도 인덱스를 생성 및 빌드해서 사용하는 것이 좋아 보인다.

 

| 활용 예

 

배경 씬 검색

  • Scenes 인덱스 내에서 검색
  • Unity Scene File을 검색
  • bg_ 키워드를 포함하는 경우

 

Raycast Target가 참인, Graphic 컴포넌트 검색

 

Hierarchy 내에서 검색
  • Raycast Target 참인 경우
  • TextMeshProUGUI / TMP_Sub Mesh UI 컴포넌트를 제외

 

Localize

  • Hierarchy 내에서 검색
  • GameText 컴포넌트를 가진 경우
  • Localize Key 프로퍼티를 검색 결과에 추가

 

Texture 포맷

  • Project 내에서 검색
  • 텍스쳐 파일 검색
  • 디렉토리 지정
  • 압축 포맷 및 텍스쳐 사이즈를 검색결과에 추가

 

Missing Script / Prefab / Asset 검색

  • Hierarchy 내에서 검색
  • 필터 Any (Script, Prefab, Asset) 검색

 

| 결론

 

Unity Search(QuickSearchModule)는 사용이 간편하면서도 강력한 기능을 제공하는 모듈이라 할 수 있다.

기존에는 특정 객체의 검증이나 특정 케이스의 객체를 목록화하려면 개별 오브젝트의 인스펙터를 확인하거나 직접 스크립트를 작성해야 했다.

 

하지만, Unity Search의 경우엔 간단한 설정만으로도 특정 어셋을 찾고, 메뉴 커맨드를 실행할 수 있다.

R&D 및 활용예를 만들면서 포맷이 잘못 설정된 파일을 쉽게 찾을 수 있었다.

 

검색은 기존의 Hierarchy와 Project Window 툴바에서 제공되던 검색 필터와 유사한 방식으로 사용 가능하며, (ex) t:prefab t:scene 등) 좀 더 강화된 검색 표현식(LISP의 S-expression과 유사)을 추가적으로 제공하고 있다. 또한 검색 쿼리 작성 없이 다양한 GUI 검색 필터를 제공하고 있어 사용이 매우 용이했다.

 

기본적으로 제공되는 여러 Search Provider(File, Log, Package, Scene, Adb, Asset, Settings, Menu 등) 외에도 커스마이즈 또한 가능한데, 관련 클래스 및 Attribute, delegate의 정의 만으로 커스텀 Search Provider를 제작할 수 있다.

 

이를 통해 별도의 커스텀 검색과 액션을 지정할 수 있다.

이러한 기능들을 잘 활용한다면 프로젝트 관리와 작업 효율성을 크게 향상시킬 수 있으리라 생각이 든다.

 

| 참고

 

메뉴얼

기본 Search Provider

 

UnityCsReference/Modules/QuickSearch/Editor/Providers at master · Unity-Technologies/UnityCsReference

Unity C# reference source code. Contribute to Unity-Technologies/UnityCsReference development by creating an account on GitHub.

github.com

 

 

반응형

| 개요

유니티 에디터에서 흔하게 볼 수 있는 Flexible한 UI 구성을 자주 볼 수 있다.

사소한 부분이긴 하지만, 사용 편의성이 크게 다가오기도 한다.

 

때문에, 커스텀한 에디터에서 차용하고 싶어도

기존의 IMGUI에선 구현하기가 번거로웠는데 UIToolkit의 TwoPaneSplitView를 이용하면 간단하게 구현이 가능하다.

 

 

Unity - Manual: Create a custom Editor window

Create a Custom Inspector Create a custom Editor window Custom Editor windows allow you to extend Unity by implementing your own editors and workflows. This guide covers creating an Editor window through code, reacting to user input, making the UI(User Int

docs.unity3d.com

위 매뉴얼을 참고하면 쉽게 구분되고 사이즈 조절이 가능한 두개의 패널을 구현할 수 있다.

그렇다면 3개로 구성하되 좌측과 우측은 고정적인 패널로 중앙 부분의 컨텐츠 패널은 Flexible하게 구성할 순 없을까?

 

| 구현

var splitView = new TwoPaneSplitView(0, 300, TwoPaneSplitViewOrientation.Horizontal);
var splitView2 = new TwoPaneSplitView(1, 300, TwoPaneSplitViewOrientation.Horizontal);
{
	// contentView (flexed)
	var scrollView = new ScrollView(ScrollViewMode.VerticalAndHorizontal);
	splitView2.Add(scrollView);

	var fixedPane = CreateInspectorPane();
	splitView2.Add(fixedPane);
}
		
var flexedPane = new VisualElement();
flexedPane.Add(splitView2);
flexedPane.style.minWidth = 200;

splitView.Add(CreateBoardView());
splitView.Add(flexedPane);

rootVisualElement.Add(splitView);
 

간단히 말하자면 2개의 TwoPaneSplitView를 활용하면 된다.

구분
Fixed
Flexed
첫번째 SplitView
Board View(Left)
두번째 SplitView
두번째 SplitView
Inspector (Right)
Content

위와 같이 첫 번째 SplitView는 Flexed Pane에 SplitView를 겹치면 된다.

(TwoPaneSplitView의 생성자에서 첫번째 인자로 Fixed 패널의 인덱스를 지정할 수 있는데 그 부분을 활용하였다.)

좌측/우측 패널은 위치를 고정하고, 컨텐츠 패널만 Flexible하게 구성할 수 있다.

| 예제 코드

using UnityEngine.UIElements;
using UnityEditor;
using UnityEditor.UIElements;

public class FooEditor : EditorWindow
{
	[MenuItem("Tools/Foo", false)]
	static public void Open()
	{
		var window = GetWindow<FooEditor>(false, "Foo", true);
		window.Initialize();
	}

	public void Initialize()
    {
		var splitView = new TwoPaneSplitView(0, 300, TwoPaneSplitViewOrientation.Horizontal);
		var splitView2 = new TwoPaneSplitView(1, 300, TwoPaneSplitViewOrientation.Horizontal);
		{
			// contentView (flexed)
			var scrollView = new ScrollView(ScrollViewMode.VerticalAndHorizontal);
            {
				scrollView.Add(new Label("Content"));
            }
			splitView2.Add(scrollView);

			var fixedPane = CreateInspectorPane();
			splitView2.Add(fixedPane);
        }		
		var flexedPane = new VisualElement();
		flexedPane.Add(splitView2);
		flexedPane.style.minWidth = 200;

		splitView.Add(CreateBoardView());
		splitView.Add(flexedPane);

		var toolBar = new Toolbar();
		{
			var fileButton = new ToolbarButton() { text = "File", name = "FileButton" };
			toolBar.Add(fileButton);

			toolBar.Add(new ToolbarSpacer() { flex = true });

			var helpButton = new ToolbarButton() { text = "Help" };
			toolBar.Add(helpButton);
		}

		rootVisualElement.Add(toolBar);
		rootVisualElement.Add(splitView);
	}

	// Left Pane
	public VisualElement CreateBoardView()
	{
		var boardView = new VisualElement();
		{
			var fooField = new TextField() { label = "Foo" };
			boardView.Add(fooField);

			var barButton = new Button() { text = "Bar" };
			boardView.Add(barButton);
		}
		return boardView;
	}

	// Right Pane
	public VisualElement CreateInspectorPane()
    {
		var inspectorPane = new VisualElement();
        {
			var fooToggle = new Toggle() { label = "Foo" };
			inspectorPane.Add(fooToggle);

			var barToggle = new Toggle() { label = "Bar" };
			inspectorPane.Add(barToggle);
		}
		return inspectorPane;
	}
}
 
반응형
#getMobileprovisionUUID.sh

#!/bin/bash
if [ $# -ne 1 ]
then
 echo "Usage: getmobileuuid the-mobileprovision-file-path"
 exit 1
fi
# mobileprovision_uuid=`grep UUID -A1 -a $1 | grep -o "[-A-Z0-9]\{36\}"`
mobileprovision_uuid=`/usr/libexec/PlistBuddy -c "Print UUID" /dev/stdin <<< $(/usr/bin/security cms -D -i $1)`
echo "UUID is:"
echo ${mobileprovision_uuid}
${scriptPath}/getMobileprovisionUUID.sh ${provisionPath}/${provisionName}.mobileprovision
UUID is:
UUID 결과값
반응형

| 현상

 

macOS 업데이트 후, il2cpp 빌드 중 clang++와 같은 ndk 관련 툴 사용 중 위와 같은 에러가 발생

stdout:
Building libil2cpp.so with AndroidToolChain
    Output directory: /Users/<usr>/.jenkins/workspace/<job>/Temp/StagingArea/assets/bin/Data/Native/armeabi-v7a
    Cache directory: /Users/<usr>/.jenkins/workspace/<job>/Library/il2cpp_android_armeabi-v7a/il2cpp_cache
ObjectFiles: 998 of which compiled: 371
    Time Compile: 74211 milliseconds Il2CppTypeDefinitions.cpp
    Time Compile: 68481 milliseconds Il2CppMethodPointerTable.cpp
    Time Compile: 55285 milliseconds Il2CppAttributes.cpp
    Time Compile: 41421 milliseconds Il2CppMetadataUsage.cpp
    Time Compile: 26292 milliseconds Il2CppInvokerTable.cpp
    Time Compile: 17629 milliseconds Il2CppGenericMethodPointerTable.cpp
    Time Compile: 12918 milliseconds Il2CppGenericClassTable.cpp
    Time Compile: 10404 milliseconds Bulk_Assembly-CSharp_26.cpp
    Time Compile: 9629 milliseconds Bulk_Assembly-CSharp_49.cpp
    Time Compile: 9063 milliseconds Bulk_Assembly-CSharp_144.cpp
Total compilation time: 98643 milliseconds.
il2cpp.exe didn't catch exception: Unity.IL2CPP.Building.BuilderFailedException: /Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ @"/var/folders/wp/pskqw4ns3cn27r6k10158xkc0000gn/T/tmpWedXj6.tmp" -o "/Users/<usr>/.jenkins/workspace/<job>/Library/il2cpp_android_armeabi-v7a/il2cpp_cache/linkresult_6F0877EF66902EFEC137A171BB702A20/libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/platforms/android-16/arch-arm" -gcc-toolchain "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold
 
clang++: error: unable to execute command: Killed: 9
clang++: error: linker command failed due to signal (use -v to see invocation)
 
 
   at Unity.IL2CPP.Building.CppProgramBuilder.PostprocessObjectFiles(HashSet`1 objectFiles, CppToolChainContext toolChainContext)
   at Unity.IL2CPP.Building.CppProgramBuilder.Build(IBuildStatistics& statistics)
   at il2cpp.Program.DoRun(String[] args)
   at il2cpp.Program.Run(String[] args)
   at il2cpp.Program.Main(String[] args)
stderr:
 
Unhandled Exception: Unity.IL2CPP.Building.BuilderFailedException: /Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ @"/var/folders/wp/pskqw4ns3cn27r6k10158xkc0000gn/T/tmpWedXj6.tmp" -o "/Users/<usr>/.jenkins/workspace/<job>/Library/il2cpp_android_armeabi-v7a/il2cpp_cache/linkresult_6F0877EF66902EFEC137A171BB702A20/libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/platforms/android-16/arch-arm" -gcc-toolchain "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold
 
clang++: error: unable to execute command: Killed: 9

 

 

| 원인

 

macOS Catalina 업데이트 후 보안이 강화되었다.

확인되지 않은 개발자의 앱을 열려는 경우, 경고 팝업이 발생.

 

 

| 해결방법

 

차단된 앱을 허용하기 위해선 시스템 환경 설정 > 보안 및 개인 정보 보호 > 일반 > 확인 없이 허용 버튼을 눌러서 차단을 해제하는 방법도 있지만 NDK에서 새로운 앱을 사용할때마다 차단을 하나하나 해줘야하는 번거로움이 있습니다.

보안엔 안좋을 수 있지만, 아래 방법을 통해서 앱에 해당 보안 설정을 모두 허용해주도록 합니다.

sudo spctl --master-disable

해당 명령어를 터미널에서 입력 후 적용을 위해서 재부팅 필요.

 

반응형

+ Recent posts