ربط الخطأ في Sun Studio 10 تحت Solaris
-
29-09-2019 - |
سؤال
كتبت برنامج اختبار مثل هذا:
#include <sys/socket.h>
int main( void ) {
int sock = socket(AF_INET, SOCK_DGRAM, 0);
return 0;
}
وحاول تجميعه:
$ /tool/sunstudio/bin/cc test.c
Undefined first referenced
symbol in file
socket test.o
ld: fatal: Symbol referencing errors. No output written to a.out
الإخراج هو "لم يتم الرجوع إلى مقبس الرمز".
يرجى إعطائي الاتجاه حتى أتمكن من حل هذا.
المحلول
هذا هو السؤال.
كتبت برنامج اختبار مثل هذا:
#include <sys/socket.h>
int main( void ) {
int sock = socket(AF_INET, SOCK_DGRAM, 0);
return 0;
}
وحاولت تجميعها (هذا هو الإخراج الذي يساعد حقًا ، عليك أن تتذكر أن المجمعين الحديثين يبذلون قصارى جهدهم لمساعدتك في إصلاح أي مشاكل):
$ /tool/sunstudio/bin/cc test.c
Undefined first referenced
symbol in file
socket test.o
ld: fatal: Symbol referencing errors. No output written to a.out
الآن ، من الإخراج يمكننا أن نرى أن الرمز socket
لم يتم الرجوع إليه. لذلك إذا كتبت man socket
سوف تحصل على ما يلي من صفحة الرجل:
SYNOPSIS
cc [ flag ... ] file ... -lsocket -lnsl [ library ... ]
ال -l
يشير العلم إلى أنه لاستخدام هذه الوظيفة ، تحتاج أيضًا إلى ربط المكتبة المسماة. في هذه الحالة ، يُطلب منك إضافة -lsocket -lnsl
إلى cc
سطر الأوامر على النحو التالي:
$ /tool/sunstudio/bin/cc test.c -lsocket -lnsl
نصائح أخرى
يجب عليك الارتباط في مكتبة المقبس ، في سطر الأوامر:
-lsocket
تحتاج إلى إضافة على الأقل -lsocket
إلى خطوة الارتباط الخاصة بك ، IE رابط مع libsocket.so. لا أعرف كيف أفعل ذلك في Sunstudio UI ، على الرغم من ذلك - هل تعتمد مشاريعها؟
عادة ما تكون صفحة الرجل مكانًا جيدًا للبحث عن المكتبات المطلوبة ؛ في هذه الحالة صفحة رجل للمقبس يوصي أيضا -lnsl
(انظر الملخص) بحيث قد يكون ذلك مطلوبًا أيضًا ، لكنني لا أتذكر أنه ضروري.