我使用痛飲生成C#包裝爲從C#中使用一些C代碼庫。當我運行痛飲,它會生成一個公開的所有功能,所生成的PInvoke C#文件的包裝C文件...例如:非託管C#調用靜態庫
// This is in KodLogic_wrap.c
SWIGEXPORT void SWIGSTDCALL CSharp_DMGameMode_timeLimit_set(void * jarg1, unsigned short jarg2) { ... }
// This is in KodLogicPInvoke.cs
[global::System.Runtime.InteropServices.DllImport("KodLogic", EntryPoint="CSharp_DMGameMode_timeLimit_set")]
這時候我建立一個動態的偉大工程圖書館。不過,我需要現在支持iOS,所以我已經準備好了一個靜態庫,並且通過了-dllimport '__Internal'
選項來讓它工作。
不幸的是,我收到鏈接錯誤,如:
"_DMGameMode_timeLimit_set", referenced from:
RegisterMonoModules() in RegisterMonoModules.o
(maybe you meant: _CSharp_DMGameMode_timeLimit_set)
事實上,我確實意味着「CSharp_DMGameMode_timeLimit_set」,但是這就是「入口點」的說法的呢?
所以,因爲這個錯誤是由Unity產生的Xcode項目拋出,我不太清楚什麼是失敗的根源。它是否對靜態庫失敗?這是否需要在統一方或瑞格方面進行修正?
更新:挖掘更多的進入在此之後,我想我怎麼在這裏上的輕微想法..
的主要問題似乎是從AOT編譯器,它會嘗試編譯所有的CS代碼到ARM程序集。這似乎是iOS所必需的,因此在Unity的AOT編譯期間,它會生成一個文件RegisterMonoModules.cpp
,該文件嘗試爲本機代碼定義訪問函數。 RegisterMonoModules.cpp
不尊重入口點參數,這將導致未定義的符號錯誤被拋出...
仍嘗試找到適當的解決方法。