আসুন দেখুন কি চলছে, চেষ্টা করুন
$ du -hs A
13M A
$ file A
A: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.27, not stripped
$ ldd A
linux-vdso.so.1 => (0x00007fff1b9ff000)
libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0x00007fb21f418000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007fb21f0d9000)
libGLU.so.1 => /usr/lib/libGLU.so.1 (0x00007fb21ee6d000)
libGL.so.1 => /usr/lib/libGL.so.1 (0x00007fb21ebf4000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fb21e988000)
libm.so.6 => /lib/libm.so.6 (0x00007fb21e706000)
...
আপনি ldd
আউটপুট থেকে দেখতে পান যে জিএইচসি একটি গতিশীলভাবে সংযুক্ত এক্সিকিউটেবল উত্পাদন করেছে, তবে কেবল সি লাইব্রেরিগুলি গতিশীলভাবে লিঙ্কযুক্ত ! সমস্ত হাস্কেল গ্রন্থাগার ভার্বাটিমে অনুলিপি করা হয়েছে।
একদিকে: যেহেতু এটি একটি গ্রাফিক্স-নিবিড় অ্যাপ্লিকেশন, তাই আমি অবশ্যই সংকলন করব ghc -O2
আপনি করতে পারেন দুটি জিনিস আছে।
প্রত্যাহার প্রতীক
একটি সহজ সমাধান: বাইনারি ফালা:
$ strip A
$ du -hs A
5.8M A
স্ট্রিপ অবজেক্ট ফাইল থেকে প্রতীকগুলি বাতিল করে দেয়। এগুলি সাধারণত ডিবাগিংয়ের জন্য প্রয়োজন।
গতিশীলভাবে হাস্কেল লাইব্রেরি সংযুক্ত
সম্প্রতি, জিএইচসি সি এবং হাস্কেল উভয় লাইব্রেরির গতিশীল সংযোগের জন্য সমর্থন পেয়েছে । বেশিরভাগ ডিস্ট্রোস এখন হাসেল লাইব্রেরির ডায়নামিক লিঙ্কিং সমর্থন করার জন্য নির্মিত জিএইচসি-র একটি সংস্করণ বিতরণ করে। ভাগ করা হাস্কেল লাইব্রেরিগুলি প্রতিটি হাস্যেল প্রোগ্রামের মধ্যে প্রতিটি সময় সম্পাদনযোগ্যতে অনুলিপি না করে ভাগ করা যেতে পারে।
লেখার সময় লিনাক্স এবং উইন্ডোজ সমর্থিত।
হাস্কেল গ্রন্থাগারগুলিকে গতিশীলভাবে সংযুক্ত করার অনুমতি দেওয়ার জন্য আপনাকে সেগুলি এর -dynamic
মতো সংকলন করতে হবে :
$ ghc -O2 --make -dynamic A.hs
এছাড়াও, আপনি যে কোনও লাইব্রেরি ভাগ করতে চান তা দিয়ে এগুলি তৈরি করা উচিত --enabled-shared
:
$ cabal install opengl --enable-shared --reinstall
$ cabal install glfw --enable-shared --reinstall
এবং আপনি একটি অনেক ছোট নির্বাহযোগ্য, এবং সি এবং হাস্কেল নির্ভরতা উভয়ই গতিশীলভাবে সমাধান করা শেষ হবে।
$ ghc -O2 -dynamic A.hs
[1 of 4] Compiling S3DM.V3 ( S3DM/V3.hs, S3DM/V3.o )
[2 of 4] Compiling S3DM.M3 ( S3DM/M3.hs, S3DM/M3.o )
[3 of 4] Compiling S3DM.X4 ( S3DM/X4.hs, S3DM/X4.o )
[4 of 4] Compiling Main ( A.hs, A.o )
Linking A...
এবং, voilà!
$ du -hs A
124K A
যা আপনি আরও ছোট করতে স্ট্রিপ করতে পারেন:
$ strip A
$ du -hs A
84K A
বহু গতিশীল সংযুক্ত সি এবং হাস্কেল টুকরো থেকে তৈরি একটি অনাদায়ী ওজনসি কার্যকর:
$ ldd A
libHSOpenGL-2.4.0.1-ghc7.0.3.so => ...
libHSTensor-1.0.0.1-ghc7.0.3.so => ...
libHSStateVar-1.0.0.0-ghc7.0.3.so =>...
libHSObjectName-1.0.0.0-ghc7.0.3.so => ...
libHSGLURaw-1.1.0.0-ghc7.0.3.so => ...
libHSOpenGLRaw-1.1.0.1-ghc7.0.3.so => ...
libHSbase-4.3.1.0-ghc7.0.3.so => ...
libHSinteger-gmp-0.2.0.3-ghc7.0.3.so => ...
libHSghc-prim-0.2.0.0-ghc7.0.3.so => ...
libHSrts-ghc7.0.3.so => ...
libm.so.6 => /lib/libm.so.6 (0x00007ffa4ffd6000)
librt.so.1 => /lib/librt.so.1 (0x00007ffa4fdce000)
libdl.so.2 => /lib/libdl.so.2 (0x00007ffa4fbca000)
libHSffi-ghc7.0.3.so => ...
একটি চূড়ান্ত বিষয়: এমনকি কেবল স্থিতিশীল লিঙ্কযুক্ত সিস্টেমেও আপনি শীর্ষ স্তরের ক্রিয়াকলাপের জন্য একটি .o ফাইল পাওয়ার জন্য -স্প্লিট-অবজেক্টগুলি ব্যবহার করতে পারেন যা স্থিরভাবে সংযুক্ত লাইব্রেরির আকারকে আরও হ্রাস করতে পারে। এটি -স্প্লিট-আপত্তি দিয়ে তৈরি করতে জিএইচসি প্রয়োজন, যা কিছু সিস্টেম করা ভুলে যায়।