जो समस्या मुझे समझ में आ रही है वह इस प्रकार है। आपके पास कई पुस्तकालय, कुछ स्थिर, कुछ गतिशील और कुछ स्थिर और गतिशील दोनों हैं। gcc का डिफ़ॉल्ट व्यवहार "ज्यादातर डायनामिक" लिंक करना है। यही कारण है, जीसीसी गतिशील पुस्तकालयों के लिए लिंक जब संभव है, लेकिन अन्यथा स्थिर पुस्तकालयों के लिए वापस गिर जाता है। आप का उपयोग करते हैं स्थैतिक विकल्प के लिए जीसीसी व्यवहार एक उपयुक्त गतिशील पुस्तकालय नहीं है, भले ही यदि कोई स्थिर पुस्तकालय पाया जा सकता है एक त्रुटि के साथ ही लिंक स्थिर पुस्तकालयों और बाहर निकलने के लिए है।
एक अन्य विकल्प है, जो मैं कई मौकों कामना पर है जीसीसी था, मैं क्या कहते हैं -mostly स्थैतिक और अनिवार्य रूप के विपरीत है -dynamic (डिफ़ॉल्ट)। -अत्यंत-स्थैतिक होगा, अगर यह अस्तित्व में है, स्थैतिक पुस्तकालयों के खिलाफ लिंक करना पसंद करते हैं, लेकिन गतिशील पुस्तकालयों में वापस आ जाएगा।
यह विकल्प मौजूद नहीं है लेकिन इसे निम्नलिखित एल्गोरिथ्म के साथ अनुकरण किया जा सकता है:
लिंक कमांड लाइन का निर्माण-साथ-साथ बाहर करना ।
डायनेमिक लिंक विकल्पों पर Iterate करें।
लाइब्रेरी पथों को संकलित करें, अर्थात फॉर्म के वे विकल्प -L <lib_dir> एक चर <lib_pkath> में
प्रत्येक डायनेमिक लिंक विकल्प के लिए, यानी फॉर्म -l <lib_name> , कमांड gcc <lib_path> -print-file-name = 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"