সমস্যাটি যা আমি বুঝতে পেরেছি তা নিম্নরূপ। আপনার কয়েকটি গ্রন্থাগার রয়েছে, কিছু স্ট্যাটিক, কিছু গতিশীল এবং কিছু স্থির এবং গতিশীল amic জিসিসি'র ডিফল্ট আচরণটি "বেশিরভাগ গতিশীল" লিঙ্ক করা। এটি হ'ল জিসিসি গতিশীল লাইব্রেরিতে লিঙ্কগুলি সম্ভব হলে কিন্তু অন্যথায় স্থির লাইব্রেরিতে ফিরে যায়। আপনি ব্যবহার করেন, তখন -static বিকল্পে ভালো হচ্ছে gcc আচরণ যথাযথ গতিশীল লাইব্রেরি আছে এমনকি যদি কোন স্ট্যাটিক গ্রন্থাগার খুঁজে পাওয়া যেতে পারে একটি ত্রুটির কথা কেবলমাত্র লিঙ্কের স্ট্যাটিক লাইব্রেরি ও প্রস্থান করে।
আরেকটি বিকল্প, যা আমি বেশ কয়েকবার আকাঙ্ক্ষিত আছে জিসিসি ছিল, আমি কি কল -mostly স্ট্যাটিক এবং মূলত বিপরীত -dynamic (ডিফল্ট)। প্রায়-স্থিতিশীল , যদি এটি বিদ্যমান থাকে তবে স্থির লাইব্রেরিগুলির সাথে লিঙ্ক করতে পছন্দ করলেও ডায়নামিক লাইব্রেরিতে ফিরে যেতে হবে।
এই বিকল্পটি বিদ্যমান নেই তবে এটি নিম্নলিখিত অ্যালগরিদম দিয়ে অনুকরণ করা যেতে পারে:
-স্ট্যাটিক সহ আউট লিঙ্ক কমান্ড লাইন তৈরি করা ।
ডায়নামিক লিঙ্ক বিকল্পগুলির মধ্যে আইট্রেট করুন।
গ্রন্থাগার পাথ স্তূপাকার, অর্থাত ফর্মের সেই সব বিকল্প -L <lib_dir> একটি পরিবর্তনশীল মধ্যে <lib_path>
প্রতিটি ডায়নামিক লিঙ্ক অপশনের জন্য, যেমন -l <lib_name> ফর্মের জন্য , জিসিসি <lib_path> -প্রিন্ট-ফাইল-নাম = lib <lib_name> .a কমান্ডটি চালান এবং আউটপুট ক্যাপচার করুন।
যদি কমান্ডটি আপনি যা করেছেন তা ব্যতীত অন্য কিছু প্রিন্ট করে তবে এটি স্থির লাইব্রেরির পুরো পথ হবে। স্ট্যাটিক লাইব্রেরির পুরো পথ দিয়ে গতিশীল লাইব্রেরি বিকল্পটি প্রতিস্থাপন করুন।
আপনি পুরো লিঙ্ক কমান্ড লাইনটি প্রক্রিয়া না করা পর্যন্ত ধুয়ে ফেলুন এবং পুনরাবৃত্তি করুন। স্থির লিঙ্ক থেকে বাদ দিতে স্ক্রিপ্টটি গ্রন্থাগারের নামের একটি তালিকাও নিতে পারে।
নিম্নলিখিত বাশ স্ক্রিপ্টটি কৌশলটি করছে বলে মনে হচ্ছে:
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 [--exclude <lib_name>]. . . <link_command>"
fi
exclude=()
lib_path=()
while [ $# -ne 0 ]; do
case "$1" in
-L*)
if [ "$1" == -L ]; then
shift
LPATH="-L$1"
else
LPATH="$1"
fi
lib_path+=("$LPATH")
echo -n "\"$LPATH\" "
;;
-l*)
NAME="$(echo $1 | sed 's/-l\(.*\)/\1/')"
if echo "${exclude[@]}" | grep " $NAME " >/dev/null; then
echo -n "$1 "
else
LIB="$(gcc $lib_path -print-file-name=lib"$NAME".a)"
if [ "$LIB" == lib"$NAME".a ]; then
echo -n "$1 "
else
echo -n "\"$LIB\" "
fi
fi
;;
--exclude)
shift
exclude+=(" $1 ")
;;
*) echo -n "$1 "
esac
shift
done
echo
উদাহরণ স্বরূপ:
mostlyStatic gcc -o test test.c -ldl -lpthread
আমার সিস্টেমে ফেরত:
gcc -o test test.c "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libdl.a" "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libpthread.a"
বা একটি বাদ দিয়ে:
mostlyStatic --exclude dl gcc -o test test.c -ldl -lpthread
আমি তখন পাই:
gcc -o test test.c -ldl "/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/libpthread.a"