বিল্ডিং ওএসএক্স অ্যাপ বান্ডেল


90

ধরুন আমি এক্সকোড ব্যবহার না করে একটি ওএসএক্স অ্যাপ তৈরি করেছি। জিসিসির সাথে সংকলনের পরে আমি একটি এক্সিকিউটেবল পাই যা বেশ কয়েকটি অন্যান্য গ্রন্থাগারের সাথে সংযুক্ত is এই লাইব্রেরির কয়েকটি আবার অ-মানক সিস্টেম লাইব্রেরিতে গতিশীলভাবে সংযুক্ত থাকতে পারে

এমন কোনও সরঞ্জাম রয়েছে যা বিদ্যমান ওএসএক্স অ্যাপ্লিকেশন বান্ডেল তৈরি করে প্রয়োজনীয় ডিরেক্টরি কাঠামো তৈরি করে এবং তারপরে পুনরাবৃত্তভাবে অনুলিপি / চেকিং / ফিক্সিং লিঙ্কগুলি নিশ্চিত করে যাতে সমস্ত গতিশীল নির্ভরতাও অ্যাপ্লিকেশন বান্ডলে রয়েছে?

আমার ধারণা আমি এই জাতীয় কিছু লেখার চেষ্টা করতে পারি তবে আমি ভাবছিলাম যে এরকম কিছু ইতিমধ্যে বিদ্যমান আছে কিনা।


4
বেশ কয়েকটি কারণে আমি এক্সকোড ব্যবহার করতে পারি না। যার মধ্যে একটি হ'ল আমি কাস্টম জিসিসি ব্যবহার করি। এক্সকোড আমাকে একটি আলাদা জিসিসি নির্দিষ্ট করার অনুমতি দেয় না। আমি আমার মেকফিলগুলি তৈরি করতে চক্র ব্যবহার করছি।
যোগী

>> সেই লাইব্রেরিগুলির মধ্যে কিছুগুলি আবার অ-মানক সিস্টেম লাইব্রেরিতে গতিশীলভাবে সংযুক্ত থাকতে পারে << নির্বাচিত প্রতিক্রিয়া এই ক্ষেত্রে সাহায্য করে না। কীভাবে সমাধান করলেন?
ফ্লোইউআই সিম্পলইউটিস্টিং ডটকম

উত্তর:


143

ম্যাকোএসএক্স, ইজি এবং দ্যুগলিতে একটি অ্যাপ বান্ডেল তৈরির দুটি উপায় রয়েছে।

সহজ উপায়টি কেবল এক্সকোড ব্যবহার করা। সম্পন্ন.

সমস্যাটি কখনও কখনও আপনি করতে পারেন না।

আমার ক্ষেত্রে আমি এমন একটি অ্যাপ তৈরি করছি যা অন্যান্য অ্যাপ্লিকেশনগুলি তৈরি করে। আমি ধরে নিতে পারি না ব্যবহারকারীর এক্সকোড ইনস্টল আছে। আমি লাইব্রেরিগুলি তৈরি করতে ম্যাকপোর্টসও ব্যবহার করছি যা আমার অ্যাপের উপর নির্ভর করে। এই ডায়ালিবগুলি অ্যাপটি বিতরণের আগে আমার অ্যাপ্লিকেশনটির সাথে বান্ডিল হয়ে গেছে তা নিশ্চিত করা দরকার।

দাবি অস্বীকার: আমি এই পোস্টটি লেখার জন্য পুরোপুরি অযোগ্য হয়েছি, বিদ্যমান সমস্ত অ্যাপ্লিকেশন এবং ট্রায়াল এবং ত্রুটিটিকে আলাদা করে রেখে সমস্ত কিছু অ্যাপল ডক্স থেকে উদ্ভাসিত হয়েছে। এটি আমার পক্ষে কাজ করে তবে সম্ভবত ভুল। আপনার কোনও সংশোধন থাকলে দয়া করে আমাকে ইমেল করুন।

প্রথম জিনিসটি আপনার জানা উচিত যে অ্যাপ্লিকেশন বান্ডিলটি কেবল একটি ডিরেক্টরি।
অনুমানমূলক foo.app এর কাঠামোটি পরীক্ষা করি।

foo.app/
    বিষয়বস্তু /
        তথ্য.পুলিস্ট
        ম্যাক অপারেটিং সিস্টেম/
            ফু
        সংস্থান /
            foo.icns

তথ্য.পল্লিস্ট একটি সরল এক্সএমএল ফাইল। আপনি এটিকে কোনও পাঠ্য সম্পাদক বা সম্পত্তি কোড সম্পাদক অ্যাপ্লিকেশন দিয়ে সম্পাদনা করতে পারেন যা এক্সকোডের সাথে বান্ডেলযুক্ত। (এটি / বিকাশকারী / অ্যাপ্লিকেশন / ইউটিলিটিস / ডিরেক্টরিতে রয়েছে)।

আপনার মূল বিষয়গুলি অন্তর্ভুক্ত করতে হবে:

সিএফবান্ডেলনাম - অ্যাপটির নাম।

সিএফবান্ডিলআইকন - একটি আইকন ফাইল সামগ্রী / সংস্থানসমূহের ডিয়ার হিসাবে ধরে নেওয়া হয়। আইকনটি তৈরি করতে আইকন রচয়িতা অ্যাপ্লিকেশনটি ব্যবহার করুন। (এটি / বিকাশকারী / অ্যাপ্লিকেশনস / ইউটিলিটিস / ডিরেক্টরিতেও রয়েছে) আপনি কেবল তার উইন্ডোতে একটি পিএনজি টেনে আনতে এবং ড্রপ করতে পারেন এবং স্বয়ংক্রিয়ভাবে আপনার জন্য মিপ-স্তর তৈরি করা উচিত।

CFBundleExecutable - সামগ্রী / ম্যাকোস / সাব-ফোল্ডারে থাকা নির্বাহযোগ্য ফাইলের নাম।

আরও অনেক বিকল্প রয়েছে, উপরের তালিকাভুক্তগুলি কেবলমাত্র সর্বনিম্ন। এখানে তথ্য.পল্লিস্ট ফাইল এবং অ্যাপ্লিকেশন বান্ডিল কাঠামোর কয়েকটি অ্যাপল ডকুমেন্টেশন রয়েছে ।

এছাড়াও, এখানে একটি নমুনা তথ্য.প্লেস্ট।

<? এক্সএমএল সংস্করণ = "1.0" এনকোডিং = "ইউটিএফ -8"?>
<! DOCTYPE plist PUBLIC "- // অ্যাপল কম্পিউটার // ডিটিডি প্লিজিটি 1.0 // এএন" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version = "1.0">
<ডিক্ট>
  <key> CFBundleGetInfoString </key>
  <স্ট্রিং> ফু </ স্ট্রিং>
  <key> সিএফবান্ডেলএক্সেকিউটেবল </key>
  <স্ট্রিং> ফু </ স্ট্রিং>
  <key> সিএফবান্ডেলআইডেন্টিফায়ার </key>
  <string> com.yur-company-name.www </string>
  <key> সিএফবান্ডেলনাম </key>
  <স্ট্রিং> ফু </ স্ট্রিং>
  <key> CFBundleIconFile </key>
  <string> foo.icns </string>
  <key> সিএফবান্ডেলশার্টভিশন স্ট্রিং </key>
  <string> 0.01 </string>
  <key> সিএফবান্ডেলআইনফো অভিধান অভিধান সংস্করণ </key>
  <string> 6.0 </string>
  <key> CFBundlePackageType </key> key
  <স্ট্রিং> অ্যাপল </ স্ট্রিং>
  <key> IFMajorVersion </key>
  <অন্তর্ভুক্ত> 0 </integer>
  <key> IFMinorVersion </key>
  <অন্তর্ভুক্ত> 1 </integer>
</dict>
</plist>

একটি নিখুঁত বিশ্বে আপনি কেবল আপনার নির্বাহযোগ্য বিষয়বস্তু / MacOS / dir এ ফেলে দিতে পারেন এবং সম্পন্ন করতে পারেন। তবে আপনার অ্যাপ্লিকেশনটিতে যদি কোনও মানহীন ডায়ালিব নির্ভরতা থাকে তবে তা কাজ করবে না। উইন্ডোজের মতো ম্যাকওএসও এর নিজস্ব বিশেষ ধরণের ডিএলএল হেল সঙ্গে আসে ।

আপনি যে লাইব্রেরিগুলির সাথে লিঙ্ক করেছেন সেগুলি তৈরি করতে যদি আপনি ম্যাকপোর্টস ব্যবহার করেন, তবে ডাইলিবগুলির অবস্থানগুলি আপনার কার্যকর হতে পারে এমন কোডগুলি হার্ড-কোডড। আপনি যদি এমন কোনও মেশিনে অ্যাপটি চালান যা ঠিক একই জায়গায় ডাইলিবযুক্ত থাকে তবে এটি ঠিকঠাক হবে। তবে, বেশিরভাগ ব্যবহারকারীর সেগুলি ইনস্টল করা হবে না; যখন তারা আপনার অ্যাপ্লিকেশনটিকে ডাবল-ক্লিক করবে তখন এটি ক্রাশ হবে।

নির্বাহযোগ্য আপনার বিতরণ করার আগে আপনাকে এটি লোড করা সমস্ত ডায়ালিব সংগ্রহ করতে হবে এবং অ্যাপ্লিকেশন বান্ডেলে এগুলি অনুলিপি করতে হবে। আপনাকে এক্সিকিউটেবলটি সম্পাদনা করতে হবে যাতে এটি সঠিক জায়গায় ডাইলিবগুলি সন্ধান করতে পারে। অর্থাত্ যেখানে আপনি সেগুলি অনুলিপি করেছেন।

একটি সম্পাদনযোগ্য শব্দ হাত সম্পাদনা বিপজ্জনক অধিকার? ভাগ্যক্রমে সাহায্যের জন্য কমান্ড লাইন সরঞ্জাম রয়েছে।

otool -L এক্সিকিউটেবল_নাম

এই কমান্ডটি আপনার অ্যাপের উপর নির্ভর করে সমস্ত ডায়ালিব তালিকাবদ্ধ করবে। যদি আপনি সিস্টেম / লাইব্রেরি বা usr / lib ফোল্ডারে নেই এমন কোনও কিছু দেখতে পান তবে অ্যাপ্লিকেশন বান্ডলে আপনাকে অনুলিপি করতে হবে। এগুলিকে / সামগ্রী / ম্যাকোস / ফোল্ডারে কপি করুন। এর পরে আপনার নতুন ডায়ালিব ব্যবহার করতে এক্সিকিউটেবলকে সম্পাদনা করতে হবে।

প্রথমত, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনি হেডারপ্যাড_ম্যাক্স_ইনস্টল_নাম পতাকা ব্যবহার করে লিঙ্ক করেছেন। এটি কেবল নিশ্চিত করে যে নতুন ডিলিব পাথটি যদি লম্বা হয় তবে পূর্ববর্তীটি, এর জন্য জায়গা থাকবে।

দ্বিতীয়ত, প্রতিটি ডিলিব পাথ পরিবর্তন করতে ইনস্টল_নাম_টুল ব্যবহার করুন।

ইনস্টল_নাম_তুল-বদল বিদ্যমান_পাথ_ টু_ডিলিব @ এক্সিকিউটেবল_পথ / ব্লাহ.আল্লিব এক্সিকিউটেবল_নাম

ব্যবহারিক উদাহরণ হিসাবে, আসুন আমরা বলি যে আপনার অ্যাপ্লিকেশনটি libSDL ব্যবহার করে এবং ওটুল তার অবস্থানটিকে "/opt/local/lib/lib/libSDL-1.2.0.dylib" হিসাবে তালিকাভুক্ত করে।

প্রথমে এটি অ্যাপ্লিকেশন বান্ডেলে অনুলিপি করুন।

সিপি / ওপট / লোকাল / লিব / লিবিএসডিএল 1-1.2.0. আদিলিব foo.app/ সামগ্রী / ম্যাকোস /

তারপরে নতুন অবস্থানটি ব্যবহার করতে এক্সিকিউটেবলকে সম্পাদনা করুন (দ্রষ্টব্য: আপনি এটি হেডারপ্যাড_ম্যাক্স_ইনস্টল_নামগুলির পতাকা দিয়ে তৈরি করেছেন তা নিশ্চিত করুন)

ইনস্টল_নাম_টুল-চেঞ্জ / ওপট / লোকাল / লিবি / লিবিএসডিএল ১.০.০.০.ডিলিব @ এক্সিকিউটেবল_পাথ / লাইবএসডিএল -২.২.০. আদিলিব foo.app/Contents/MacOS/foo

হ্যাঁ, আমরা প্রায় শেষ। এখনকার চলমান ডিরেক্টরিটি নিয়ে একটি ছোট সমস্যা রয়েছে।

আপনি যখন আপনার অ্যাপ্লিকেশনটি শুরু করবেন বর্তমান অ্যাপ্লিকেশনটি যেখানে অবস্থিত সেখানে ডিরেক্টরি হবে above উদাহরণস্বরূপ: আপনি যদি / অ্যাপ্লিকেশন ফোল্ডারে foo.app রাখেন তবে অ্যাপটি চালু করার সময় বর্তমান ডিরেক্টরিটি হবে / অ্যাপ্লিকেশন ফোল্ডার। আপনি যেমন আশা করতে পারেন তেমন / অ্যাপ্লিকেশনগুলি / ফু / অ্যাপ / সামগ্রী / ম্যাকোস / নয় OS

আপনি এটির জন্য অ্যাকাউন্টটি প্রয়োগ করতে আপনার অ্যাপ্লিকেশনটিকে পরিবর্তন করতে পারেন, বা আপনি এই ম্যাজিক লিটল লঞ্চ স্ক্রিপ্টটি ব্যবহার করতে পারেন যা বর্তমান ডিরেক্টরিটি পরিবর্তন করবে এবং আপনার অ্যাপ্লিকেশন চালু করবে।

#! / বিন / বাশ
সিডি "$ {0% / *}"
./foo

নিশ্চিত করুন যে আপনি যাতে Info.plist ফাইল সমন্বয় করুন CFBundleExecutable লঞ্চ স্ক্রিপ্টে এবং পূর্ববর্তী এক্সিকিউটেবল না পয়েন্ট।

ঠিক আছে, এখন সব শেষ। ভাগ্যক্রমে, আপনি যখন এই সমস্ত জিনিসগুলি জানেন তবে আপনি এটি একটি বিল্ড স্ক্রিপ্টে কবর দেবেন।


7
+1 যাইহোক, জম্বি কুকুর আমাকে খামচে ফেলে। আপনি কি ডিএলএল হেল্প চিত্রিত করার জন্য কম দাগযুক্ত ছবি ব্যবহার করতে পারেন? (উল্লেখ করবেন না যে শব্দ "ডিএলএল জাহান্নাম" প্রযোজ্য নয় গতিশীল লাইব্রেরি বিতরণ জন্য পছন্দের পদ্ধতি অবকাঠামো যা সর্বাধিক সমস্যা এড়ানোর মারফত এখনও, .dylib পদ্ধতির Unix বিন্যাসের লাইব্রেরির জন্য দরকারী।।।)
হাইনরিশ Apfelmus

4
আমরা কীভাবে ডাবল নির্ভরতা ঠিক করব? একটি ডাইলেব রেফারেন্সের মতো আরেকটি ডিলিব?
ফ্লোইউআই সিম্পলইউটিস্টিং ডটকম

সঠিক স্থানগুলির সাথে এক্সিকিউটেবলকে সংকলনের কোনও উপায় নেই যাতে আপনাকে এটি সম্পাদনা করতে না হয়?
সিঙ্ক্রোনাইজার

সুরক্ষা কতটা কঠোর হয়ে উঠেছে তা দিয়ে কি এটি কি ক্যাটালিনায় আর কাজ করবে? (ডায়ালিবস, বাইনারি ইত্যাদি পরিবর্তন করুন)
সিঙ্ক্রোনাইজার

20

আমি আসলে একটি খুব সহজ সরঞ্জাম পেয়েছি যা কিছু creditণের দাবিদার ... না - আমি এটি বিকাশ করি না;)

https://github.com/auriamg/macdylibbundler/

এটি সমস্ত নির্ভরতা সমাধান করবে এবং আপনার অ্যাপ্লিকেশন বান্ডেলে সহজেই কাজ করতে আপনার এক্সিকিউটেবলের পাশাপাশি আপনার ডাইলিব ফাইলগুলি "ঠিক" করবে।

... এটি আপনার নির্ভরশীল গতিশীল libs এর নির্ভরতাও পরীক্ষা করবে: ডি


এটি একটি সুন্দর দরকারী সরঞ্জাম! এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ।
এক্সপিনিমি

এটি নির্ভরতাগুলির নির্ভরতা এখানে অনুপস্থিত। ফিক্স?
পিটার

9

আমি এটি আমার মেকফাইলে ব্যবহার করি ... এটি একটি অ্যাপ বান্ডেল তৈরি করে creates এটি পড়ুন এবং এটি বুঝতে পারবেন, কারণ আপনার এখানে থাকা পিকেজিআইএনফো এবং ইনফো.পিস্টলিস্ট ফাইলগুলির সাথে আপনার একটি ম্যাকোক্স / ফোল্ডারে একটি পিএনজি আইকন ফাইল দরকার হবে ...

"এটি আমার কম্পিউটারে কাজ করে" ... আমি এটি ম্যাভারিকসে একাধিক অ্যাপ্লিকেশানের জন্য ব্যবহার করি ...

APPNAME=MyApp
APPBUNDLE=$(APPNAME).app
APPBUNDLECONTENTS=$(APPBUNDLE)/Contents
APPBUNDLEEXE=$(APPBUNDLECONTENTS)/MacOS
APPBUNDLERESOURCES=$(APPBUNDLECONTENTS)/Resources
APPBUNDLEICON=$(APPBUNDLECONTENTS)/Resources
appbundle: macosx/$(APPNAME).icns
    rm -rf $(APPBUNDLE)
    mkdir $(APPBUNDLE)
    mkdir $(APPBUNDLE)/Contents
    mkdir $(APPBUNDLE)/Contents/MacOS
    mkdir $(APPBUNDLE)/Contents/Resources
    cp macosx/Info.plist $(APPBUNDLECONTENTS)/
    cp macosx/PkgInfo $(APPBUNDLECONTENTS)/
    cp macosx/$(APPNAME).icns $(APPBUNDLEICON)/
    cp $(OUTFILE) $(APPBUNDLEEXE)/$(APPNAME)

macosx/$(APPNAME).icns: macosx/$(APPNAME)Icon.png
    rm -rf macosx/$(APPNAME).iconset
    mkdir macosx/$(APPNAME).iconset
    sips -z 16 16     macosx/$(APPNAME)Icon.png --out macosx/$(APPNAME).iconset/icon_16x16.png
    sips -z 32 32     macosx/$(APPNAME)Icon.png --out macosx/$(APPNAME).iconset/icon_16x16@2x.png
    sips -z 32 32     macosx/$(APPNAME)Icon.png --out macosx/$(APPNAME).iconset/icon_32x32.png
    sips -z 64 64     macosx/$(APPNAME)Icon.png --out macosx/$(APPNAME).iconset/icon_32x32@2x.png
    sips -z 128 128   macosx/$(APPNAME)Icon.png --out macosx/$(APPNAME).iconset/icon_128x128.png
    sips -z 256 256   macosx/$(APPNAME)Icon.png --out macosx/$(APPNAME).iconset/icon_128x128@2x.png
    sips -z 256 256   macosx/$(APPNAME)Icon.png --out macosx/$(APPNAME).iconset/icon_256x256.png
    sips -z 512 512   macosx/$(APPNAME)Icon.png --out macosx/$(APPNAME).iconset/icon_256x256@2x.png
    sips -z 512 512   macosx/$(APPNAME)Icon.png --out macosx/$(APPNAME).iconset/icon_512x512.png
    cp macosx/$(APPNAME)Icon.png macosx/$(APPNAME).iconset/icon_512x512@2x.png
    iconutil -c icns -o macosx/$(APPNAME).icns macosx/$(APPNAME).iconset
    rm -r macosx/$(APPNAME).iconset

তথ্য.পুলিস্ট

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleExecutable</key>
    <string>MyApp</string>
    <key>CFBundleGetInfoString</key>
    <string>0.48.2, Copyright 2013 my company</string>
    <key>CFBundleIconFile</key>
    <string>MyApp.icns</string>
    <key>CFBundleIdentifier</key>
    <string>com.mycompany.MyApp</string>
    <key>CFBundleDocumentTypes</key>
    <array>
    </array>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>0.48.2</string>
    <key>CFBundleSignature</key>
    <string>MyAp</string>
    <key>CFBundleVersion</key>
    <string>0.48.2</string>
    <key>NSHumanReadableCopyright</key>
    <string>Copyright 2013 my company.</string>
    <key>LSMinimumSystemVersion</key>
    <string>10.3</string>
</dict>
</plist>

পিকেজিআইএনফো

APPLMyAp

আপনি তথ্য.পালিস্টকে পাঠ্য স্থানধারক থাকতে পারেন এবং তারপরে সঠিক ক্ষেত্রগুলি সহ চূড়ান্ত তথ্য.প্লেলিস্ট তৈরি করতে শেড বা অজকের মতো কিছু ব্যবহার করতে পারেন। অথবা প্লাস্টি তৈরি করতে প্লুটিল ব্যবহার করতে পারেন।
হিথকে চিহ্নিত করুন

8

সবচেয়ে সহজ সমাধানটি হ'ল: কোনও পরিবর্তন না করে একবার একটি এক্সকোড প্রকল্প তৈরি করুন (অর্থাত্ এক্সকোড আপনার জন্য তৈরি করা সহজ ওয়ান উইন্ডো অ্যাপ্লিকেশনটি রাখুন), এটি তৈরি করুন এবং এটি আপনার জন্য নির্মিত বান্ডিলটি অনুলিপি করুন। তারপরে আপনার কন্টেন্টের সাথে মানিয়ে নিতে ফাইলগুলি (বিশেষত তথ্য.প্লেস্ট) সম্পাদনা করুন এবং সামগ্রী / ম্যাকোস / ডিরেক্টরিতে আপনার নিজস্ব বাইনারি রাখুন।


4
প্রশ্নটি এক্সকোড ছাড়াই এটি কীভাবে করবেন তা স্পষ্টভাবে জিজ্ঞাসা করে। আমি একই নৌকায় আছি এবং আসল উত্তর চাই।
হাইপারলজিক

4
ঠিক আছে, এটির সাথে আপনাকে নিজের জীবনে একবার এক্সকোড ব্যবহার করতে হবে :) বা কাউকে এটি করার জন্য বলতে হবে।
এফ'এক্স

@ এফ'এক্স আপনি কি কেবল উত্পন্ন যে অ্যাপ্লিকেশনটি প্রকাশ করতে পারেন? কোথাও উদাহরণ হিসাবে?
এন্ডোলিথ

3

নির্দিষ্ট পরিবেশের জন্য নির্ভরযোগ্য লাইব্রেরি সহ অ্যাপ্লিকেশন বান্ডিলগুলি তৈরি করতে সহায়তা করার জন্য কয়েকটি মুক্ত উত্স সরঞ্জাম রয়েছে, উদাহরণস্বরূপ, পাইথন-ভিত্তিক অ্যাপ্লিকেশনগুলির জন্য পাই 2 অ্যাপ্লিকেশন। যদি আপনি আরও সাধারণ খুঁজে না পান, সম্ভবত আপনি এটি আপনার প্রয়োজনের সাথে খাপ খাইয়ে নিতে পারেন।


2

আমি আশা করি আমি এই পোস্টটি আগে খুঁজে পেয়েছি ....

Run scriptআমি Releaseযখন আমার অ্যাপ্লিকেশনটির একটি সংস্করণ তৈরি করি প্রতিবার অনুরোধ করা হয় এমন একটি পর্যায়টি ব্যবহার করে এই সমস্যাটি সমাধান করার আমার স্কেচি উপায় :

# this is an array of my dependencies' libraries paths 
# which will be iterated in order to find those dependencies using otool -L
libpaths=("$NDNRTC_LIB_PATH" "$BOOST_LIB_PATH" "$NDNCHAT_LIB_PATH" "$NDNCPP_LIB_PATH" "/opt/local/lib")
frameworksDir=$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH
executable=$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH

#echo "libpaths $libpaths"
bRecursion=0
lRecursion=0

# this function iterates through libpaths array
# and checks binary with "otool -L" command for containment
# of dependency which has "libpath" path
# if such dependency has been found, it will be copied to Frameworks 
# folder and binary will be fixed with "install_name_tool -change" command
# to point to Frameworks/<dependency> library
# then, dependency is checked recursively with resolveDependencies function
function resolveDependencies()
{
    local binfile=$1
    local prefix=$2
    local binname=$(basename $binfile)
    local offset=$((lRecursion*20))
    printf "%s :\t%s\n" $prefix "resolving $binname..."

    for path in ${libpaths[@]}; do
        local temp=$path
        #echo "check lib path $path"
        local pattern="$path/([A-z0-9.-]+\.dylib)"
        while [[ "$(otool -L ${binfile})" =~ $pattern ]]; do
            local libname=${BASH_REMATCH[1]}
            otool -L ${binfile}
            #echo "found match $libname"
            printf "%s :\t%s\n" $prefix "fixing $libname..."
            local libpath="${path}/$libname"
            #echo "cp $libpath $frameworksDir"
            ${SRCROOT}/sudocp.sh $libpath $frameworksDir/$libname $(whoami)
            local installLibPath="@rpath/$libname"
            #echo "install_name_tool -change $libpath $installLibPath $binfile"
            if [ "$libname" == "$binname" ]; then
                install_name_tool -id "@rpath/$libname" $binfile
                printf "%s :\t%s\n" $prefix "fixed id for $libname."
            else
                install_name_tool -change $libpath $installLibPath $binfile
                printf "%s :\t%s\n" $prefix "$libname dependency resolved."
                let lRecursion++
                resolveDependencies "$frameworksDir/$libname" "$prefix>$libname"
                resolveBoostDependencies "$frameworksDir/$libname" "$prefix>$libname"
                let lRecursion--
            fi
            path=$temp
        done # while
    done # for

    printf "%s :\t%s\n" $prefix "$(basename $binfile) resolved."
} # resolveDependencies

# for some reason, unlike other dependencies which maintain full path
# in "otool -L" output, boost libraries do not - they just appear 
# as "libboost_xxxx.dylib" entries, without fully qualified path
# thus, resolveDependencies can't be used and a designated function is needed
# this function works pretty much in a similar way to resolveDependencies
# but targets only dependencies starting with "libboost_", copies them
# to the Frameworks folder and resolves them recursively
function resolveBoostDependencies()
{
    local binfile=$1
    local prefix=$2
    local binname=$(basename $binfile)
    local offset=$(((bRecursion+lRecursion)*20))
    printf "%s :\t%s\n" $prefix "resolving Boost for $(basename $binfile)..."

    local pattern="[[:space:]]libboost_([A-z0-9.-]+\.dylib)"
    while [[ "$(otool -L ${binfile})" =~ $pattern ]]; do
        local libname="libboost_${BASH_REMATCH[1]}"
        #echo "found match $libname"
        local libpath="${BOOST_LIB_PATH}/$libname"
        #echo "cp $libpath $frameworksDir"
        ${SRCROOT}/sudocp.sh $libpath $frameworksDir/$libname $(whoami)
        installLibPath="@rpath/$libname"
        #echo "install_name_tool -change $libname $installLibPath $binfile"
        if [ "$libname" == "$binname" ]; then
            install_name_tool -id "@rpath/$libname" $binfile
            printf "%s :\t%s\n" $prefix "fixed id for $libname."
        else
            install_name_tool -change $libname $installLibPath $binfile
            printf "%s :\t%s\n" $prefix "$libname Boost dependency resolved."
            let bRecursion++
            resolveBoostDependencies "$frameworksDir/$libname" "$prefix>$libname"
            let bRecursion--
        fi
    done # while

    printf "%s :\t%s\n" $prefix "$(basename $binfile) resolved."
}

resolveDependencies $executable $(basename $executable)
resolveBoostDependencies $executable $(basename $executable)

আশা করি এটি কারও কাজে লাগবে।


0

ডাব্লুএক্সডজেট কোড সহ ম্যাকের মেনুটির কাজ করার একটি কৌশল হ'ল সহজভাবে:

  1. যথারীতি টার্মিনালে প্রোগ্রামটি শুরু করুন (./appname)
  2. প্রোগ্রাম জিইউআই স্বাভাবিক হিসাবে শুরু হয় এবং অ্যাপটির ফোকাস হারাতে টার্মিনালটিতে ক্লিক করুন
  3. ফোকাস এবং মেনু আইটেম কাজ ফিরে পেতে জিইউআই ক্লিক করুন।

আমি একমত যে কোনও অ্যাপ্লিকেশন বান্ডিল হ'ল ম্যাকের উপর একটি প্রোগ্রাম তৈরির সঠিক উপায়। এটি ডিবাগিংয়ের সময় সহায়তার জন্য একটি সহজ কাজ।

সম্পাদনা করুন: এটি জি ++ ৪.২.১ (নভেম্বর ২০২০) সহ ম্যাক ক্যাটালিনা, ডাব্লু এক্সজেডস ৩.১.৪ রয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.