উত্তর:
নির্দেশ করে:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
এটির লিঙ্ক করার জন্য আপনার লাইব্রেরির স্থির সংস্করণ প্রয়োজন।
একটি ভাগ করা লাইব্রেরি প্রকৃতপক্ষে একটি নির্দিষ্ট বিন্যাসে নির্ধারিত এন্ট্রি পয়েন্ট সহ এক্সিকিউটেবল (এবং কিছু স্টিকি ঠিকানা সম্বলিত বিষয় অন্তর্ভুক্ত)। এটি স্ট্যাটিকালি লিঙ্ক করতে প্রয়োজনীয় সমস্ত তথ্য নেই।
আপনি স্ট্যাটিকভাবে একটি ভাগ করা লাইব্রেরি লিঙ্ক করতে পারবেন না (বা একটি স্ট্যাটিক একটি গতিশীল লিঙ্ক)।
পতাকা -static
লিঙ্কারকে ভাগ করা (.so) পরিবর্তে স্থির লাইব্রেরি (.a) ব্যবহার করতে বাধ্য করবে। তবে স্থির লাইব্রেরিগুলি সর্বদা ডিফল্টরূপে ইনস্টল করা হয় না, তাই আপনাকে নিজেরাই স্থির লাইব্রেরি ইনস্টল করতে হতে পারে।
অন্য সম্ভাব্য পদ্ধতির ব্যবহার করা statifier বা নকুলজাতীয় জন্তুবিশেষ । উভয় সরঞ্জামই ইনপুট হিসাবে গতিশীলভাবে সংযুক্ত এক্সিকিউটেবল হিসাবে নেয় এবং আউটপুট হিসাবে এম্বেড থাকা সমস্ত ভাগ করে নেওয়া লাইব্রেরি সহ একটি স্ব-অন্তর্ভুক্ত এক্সিকিউটেবল তৈরি করে।
আপনি যদি লিঙ্ক করতে চান, বলুন, libapplejuice স্ট্যাটিক্যালি, কিন্তু না, বলুন, লাইব্রোঞ্জজাইস , আপনি এই জাতীয় লিঙ্ক করতে পারেন:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
একটি সতর্কতা রয়েছে - যদি liborangejuice
ব্যবহার হয় libapplejuice
, তবে libapplejuice
গতিশীলভাবে খুব যুক্ত হবে।
liborangejuice
স্ট্যাটিক হওয়ার libapplejuice
জন্য আপনাকে স্ট্যাটিকালি পাশাপাশি লিঙ্ক করতে হবে libapplejuice
।
এবং -Wl,-Bdynamic
অন্যটি রাখতে ভুলবেন না যে আপনি সমস্ত স্থিতিশীল লিঙ্কটি শেষ করবেন, সহ libc
(যা করা ভাল নয়)।
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB libA ব্যবহার করে , এটি লিঙ্কযুক্ত এবং লিবাএরldd
কোনও রেফারেন্স দেখায় না । এক্সিকিউটেবল ভাল কাজ করে। জি ++ 4.7.3 দিয়ে পরীক্ষিত।
আপনার যদি আপনার ভাগ করা লাইব্রেরির (.so) .a ফাইল থাকে তবে আপনি কেবল এটির পুরো পথটি সহ এটি অন্তর্ভুক্ত করতে পারেন যেন এটি কোনও অবজেক্ট ফাইল was
এটি কেবল সংকলন করে main.o উত্পন্ন করে:
gcc -c main.c
এটি সম্পর্কিত স্ট্যাটিক লাইব্রেরির সাথে ফাইল যুক্ত করা এবং কার্যকর করা ("প্রধান" নাম দেওয়া হয়েছে) তৈরি করে:
gcc main.o mylibrary.a -o main
বা একক আদেশে:
gcc main.c mylibrary.a -o main
এটি একটি নিখুঁত বা আপেক্ষিক পথও হতে পারে:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
হ্যাঁ, আমি জানি এটি একটি 8 বছরের পুরানো প্রশ্ন, তবে আমাকে বলা হয়েছিল যে কোনও শেয়ার্ড-অবজেক্ট লাইব্রেরির সাথে স্থিতিশীলভাবে লিঙ্ক করা সম্ভব ছিল এবং আমি যখন এটি সম্পর্কে আরও তথ্যের জন্য অনুসন্ধান করেছি তখন এটি আক্ষরিক অর্থে শীর্ষে ছিল।
প্রকৃতপক্ষে প্রমাণ করতে যে কোনও শেয়ার্ড-অবজেক্ট লাইব্রেরির সাথে স্থিতিশীলভাবে লিঙ্ক করা সম্ভব নয় ld
( gcc
এর লিঙ্কার) - কেবলমাত্র একগুচ্ছ লোকেরা এটি সম্ভব নয় বলে জোর দিয়েছিল - নিম্নলিখিত gcc
কমান্ডটি ব্যবহার করুন :
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(অবশ্যই আপনার objectname.o
কাছ থেকে সংকলন sourcename.c
করতে হবে এবং আপনার সম্ভবত নিজের শেয়ারড-অবজেক্ট লাইব্রেরিটিও তৈরি করা উচিত you যদি আপনি -Wl,--library-path,.
এটি করেন তবে এটি ব্যবহার করুন যাতে এলডি আপনার স্থানীয় লাইব্রেরিটি স্থানীয় ডিরেক্টরিতে খুঁজে পেতে পারে))
আপনি প্রাপ্ত প্রকৃত ত্রুটিটি হ'ল:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
আশা করি এইটি কাজ করবে.
কিছুটা দেরি হলেও ... আমি একটি লিঙ্ক পেয়েছি যা আমি কয়েক বছর আগে সংরক্ষণ করেছি এবং আমি ভেবেছিলাম এটি আপনার পক্ষে কার্যকর হবে:
সিডিই: স্বয়ংক্রিয়ভাবে পোর্টেবল লিনাক্স অ্যাপ্লিকেশন তৈরি করুন
http://www.pgbovine.net/cde.html
আর্গুমেন্ট হিসাবে বাইনারি পাসিং কার্যকর করুন বাইনারিটির নাম আপনি পোর্টেবল করতে চান, উদাহরণস্বরূপ: এনএম্যাপ
./cde_2011-08-15_64 বিট এনএম্যাপ
প্রোগ্রামটি এনএএমএপ এবং তার নির্ভরশীলদের সাথে লিঙ্কযুক্ত সমস্ত লিবিগুলি পড়বে এবং এটি সমস্তগুলি সিডি-প্যাকেজ / (আপনি যে একই ডিরেক্টরিতে আছেন) নামে একটি ফোল্ডারে সংরক্ষণ করবে ।
মনে রাখবেন, পোর্টেবল প্রোগ্রাম আরম্ভ করার জন্য আপনি অবস্থিত বাইনারি Exec আছে CDE-প্যাকেজ / nmap.cde
শুভেচ্ছান্তে