Unity3D iOS referenced from: __Z19RegisterMonoModulesv in RegisterMonoModules.o

Undefined symbols for architecture armv7:
  "_iOSPluginHelloWorld", referenced from:
      __Z19RegisterMonoModulesv in RegisterMonoModules.o
ld: symbol(s) not found for architecture armv7

clang: error: linker command failed with exit code 1 (use -v to see invocation)

 유니티3D iOS 플러그인을 만들던 중 위와 같이 에러가 발생했습니다.


[DllImport("__Internal")]
private static extern void iOSPluginHelloWorld(string strMessage);

 유니티3D에서 위와같이 iOS 네이티브 코드를 호출하기 위해 extern 메서드를 선언해줘야하죠.

 그러면 빌드 후 자동으로 생성되는 Libraries/Assembly-CSharp.dll.s 과 RegisterMonoModules.cpp에 위 그림과 같이 해당 정보가 포함됩니다.

void iOSPluginHelloWorld(const char* strMessage)
{
    NSLog(@"iOS Log 1");
    UnitySendMessage("iOSManager""SetLog", strMessage);
    NSLog(@"iOS Log 2");

}

 해결하려면 함수 정의를 해줘야합니다. Classes 폴더에 원하시는 m 파일을 하나 만들어 위와 같이 함수 본체를 정의하거나

extern "C"
{
void iOSPluginHelloWorld(const char* strMessage)
{
    //NSLog(@"iOS Log 1");
    UnitySendMessage("iOSManager", "SetLog", strMessage);
    //NSLog(@"iOS Log 2");
}
}

 역시나 자동 생성되고 아무 내용없는 RegisterClasses.cpp 에 위와 같이 추가해줘도 됩니다. cpp에 추가할 때는 m과 다르게 extern "C"로 감싸줘야하구요. 그렇지 않다면 처음과 같은 에러가 발생합니다. mm도 마찬가지입니다.


(Filename: /Applications/buildAgent/work/7535de4ca26c26ac/Runtime/ExportGenerated/iPhoneSimulatorPlayerUnityLib/UnityEngineDebug.cpp Line: 54)

EntryPointNotFoundException: iOSPluginHelloWorld
at (wrapper managed-to-native) iOSManager:iOSPluginHelloWorld (string)
at iOSManager.CalliOSFunc (System.String strMessage) [0x00000] in <filename unknown>:0
at TestGUI.OnGUI () [0x00000] in <filename unknown>:0

 참고로 유니티3D iOS Player Setting에서 SDK Version을 Simulator SDK로 하면 위와 같은 오류가 발생합니다. 즉, 시뮬레이터에서는 안드로이드와 마찬가지로 플러그인 기능이 작동하지 않는다는거죠.

댓글

이 블로그의 인기 게시물

CMake Windows에 설치하기

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

크로스 스레드 작업이 잘못되었습니다. xxx 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다