android - एलएलवीएम आईआर पुस्तकालय होने के बाद, इसे आईओएस, एंड्रॉइड, विंडोज और मैक को उबंटू से कैसे पार करना है?




c++ ios (2)

मेरे पास एलएलवीएम आईआर रूपों में मेरे सभी आश्रितों और मेरे पुस्तकालय का प्रतिनिधित्व है। लिनक्स, उबंटू (उदाहरण के लिए उबंटू) से आईओएस, एंड्रॉइड, विंडोज और मैक प्लेटफार्मों के लिए एक साझा ऑब्जेक्ट में मेरी लाइब्रेरी को कैसे पार करें?

कृपया एक एकल उदाहरण स्क्रिप्ट प्रदान करें जो किसी भी उदाहरण पुस्तकालय को आपकी पसंद के किसी अन्य पुस्तकालय पर कम से कम एक निर्भरता के साथ सभी 4 प्लेटफार्मों (उदाहरण के लिए ओपनसीवी या जीरोएमक्यू 4+) के साथ संकलित करेगा।


LLVM स्टेटिक कंपाइलर (llc) का उपयोग करके, आप LLVM IR को एक विशिष्ट लक्ष्य ट्रिपल के लिए ऑब्जेक्ट फ़ाइलों में संकलित कर सकते हैं। हालाँकि टारगेट ट्राइबल्स को बहुत अच्छी तरह से प्रलेखित नहीं किया गया है, एलएलवीएम इन्फ्रास्ट्रक्चर सभी खुले स्रोत हैं, इसलिए स्रोत कोड के माध्यम से त्वरित खोज आपको here ले जाएगी।

दुर्भाग्य से, आपके द्वारा उपयोग किए जा सकने वाले संभावित ट्राएंगल की असतत सूची के लिए कोई दस्तावेज नहीं है। हालाँकि, यदि आप वास्तव में जानते हैं कि आप किस प्रणाली को लक्षित कर रहे हैं, तो ट्रिपल बनाना काफी आसान है। लक्ष्य ट्रिपल प्रलेखन से लिया, आप देख सकते हैं:

ट्रिपल का सामान्य प्रारूप है <arch><sub>-<vendor>-<sys>-<abi> , जहां:

  • arch = x86_64 , i386 , arm , thumb , mips , आदि।
  • sub = पूर्व के लिए। एआरएम पर: v5 , v6m , v7a , v7m , आदि।
  • vendor = pc , apple , nvidia , ibm , आदि।
  • sys = none , linux , win32 , darwin , cuda , आदि।
  • abi = eabi , gnu , android , macho , elf , आदि।

एक बार जब आप यह पता लगा लेते हैं कि आप किस लक्ष्य ट्रिपल का उपयोग कर रहे हैं, तो आप इसे -mtriple ध्वज का उपयोग करके स्ट्रिंग के रूप में निर्दिष्ट करते हैं। यहाँ कुछ उदाहरण हैं:

  • विंडोज: -mtriple=i686-pc-win32-gnu
  • लिनक्स: -mtriple=i686-pc-linux-gnu
  • IOS: -mtriple=armv7-apple-ios
  • Android: -mtriple=arm-linux-androideabi

इसके बाद, आपको यह निर्दिष्ट करने की आवश्यकता है कि आप फ़िलाटाइप फ़्लैग का उपयोग करके ऑब्जेक्ट फ़ाइल संकलित करना चाहते हैं:

-filetype=obj

यह पर्याप्त होना चाहिए अगर मैं आपके प्रश्न को सही ढंग से समझता हूं।

यदि आप सभी प्लेटफार्मों और ऑपरेटिंग सिस्टम पर एक ही फ़ाइल का उपयोग करने की उम्मीद कर रहे हैं, जबकि यह संभव है, तो यह बहुत काम लेगा और मैं स्टैकओवरफ्लो पर यहां से संबंधित उत्तर की उम्मीद नहीं करूंगा।


इस लिंक से , एक परिवर्तनीय LLVM_TARGETS_TO_BUILD और परिभाषा कहती है कि

एक अर्धविराम सीमांकित सूची जो नियंत्रित करती है कि लक्ष्य बनाया जाएगा और इसे llc में जोड़ा जाएगा। यह कॉन्फ़िगर स्क्रिप्ट में --enable-targets विकल्प के बराबर है। डिफ़ॉल्ट सूची को LLVM_ALL_TARGETS के रूप में परिभाषित किया गया है और इसे आउट-ऑफ-ट्री लक्ष्य शामिल करने के लिए सेट किया जा सकता है। डिफ़ॉल्ट मान में शामिल हैं: AArch64, AMDGPU, ARM, BPF, Hexagon, Mips, MSP430, NVPTX, PowerPC, Sparc, SystemZ, X86, XCore।

आपको X86 जोड़ना चाहिए और एआरएम इसमें मौजूद है। आपको 64 और Apple के लिए समर्थन जोड़ने की आवश्यकता है

इस लिंक से

संकलन को पार करना संभव है

उदाहरण कमांड जैसा दिखता है

% cmake -G "Ninja" -DCMAKE_OSX_ARCHITECTURES="armv7;armv7s;arm64"
  -DCMAKE_TOOLCHAIN_FILE=<PATH_TO_LLVM>/cmake/platforms/iOS.cmake
  -DCMAKE_BUILD_TYPE=Release -DLLVM_BUILD_RUNTIME=Off -DLLVM_INCLUDE_TESTS=Off
  -DLLVM_INCLUDE_EXAMPLES=Off -DLLVM_ENABLE_BACKTRACES=Off [options]
  <PATH_TO_LLVM>

इसके अलावा मैं इस लिंक को साझा करना चाहूंगा। इसे कहते हैं

मूल विकल्प लक्ष्य वास्तुकला को परिभाषित करना है। उस के लिए, का उपयोग करें -get। यदि आप लक्ष्य को निर्दिष्ट नहीं करते हैं, तो सीपीयू के नाम मेल नहीं खाएंगे (क्योंकि क्लैंग मेजबान ट्रिपल को मानता है), और संकलन आगे बढ़ेगा, जिससे होस्ट प्लेटफॉर्म के लिए कोड बनाया जाएगा, जो बाद में कोडांतरण या लिंक करने पर टूट जाएगा।

ट्रिपल का सामान्य प्रारूप है <arch><sub>-<vendor>-<sys>-<abi> , जहां:

arch = x86_64, i386, arm, thumb, mips, etc.
sub = for ex. on ARM: v5, v6m, v7a, v7m, etc.
vendor = pc, apple, nvidia, ibm, etc.
sys = none, linux, win32, darwin, cuda, etc.
abi = eabi, gnu, android, macho, elf, etc.




cross-compiling