تواجه مشكلة في ربط مكتبة ثابتة C ++
سؤال
لقد اكتشفت كيفية تعيين VC ++ لتجميع التعليمات البرمجية في ملف .LIB بدلاً من .exe ، لكنني أواجه مشكلة في الحصول على lib للربط مع ملفات .OBJ الأخرى.
إليكم كيف تم إعداد مجلدات المكتبة والتطبيق. (لست متأكدًا مما إذا كان هذا صحيحًا)
AppFolder
App.sln
App.ncb
*.h
*.cpp
Debug
*.obj
App.exe
وفي مكان آخر على القرص الصلب ...
LibraryFolder
lib
Library.lib
include
LibrarySolutionFolder
Library.sln
Library.ncb
*.h
*.cpp
Debug
*.obj
Library.lib
لقد تم #includ في ملفات المكتبة *.H من ملفات CPP الخاصة بتطبيقي ، وكل شيء يجمع بشكل جيد. إنه فقط عندما يربط ، أحصل على قائمة بجميع ملفات .lib التي يتم البحث فيها ، و Library.lib ليست موجودة على الرغم من أنني أدرجت في أدلة VC ++. كيف يمكنني الحصول على هذا لربط؟ (وهل أقوم بتكييف مجلدات المكتبة بشكل صحيح؟)
المحلول
في خصائص المشروع:
خصائص التكوين -> رابط -> إدخال -> تعتمدات إضافية
أضفه هناك.
أو ، في ملف .H الخاص بك للمكتبة ، أضف:
#pragma comment(lib, "Library")
هذا سيفعل ذلك تلقائيًا من أجلك.
نصائح أخرى
أدلة VC ++ هي قائمة مواقع الدليل التي تم البحث فيها أثناء الارتباط. إنها ليست قائمة بالمكتبات التي يجب ربطها.
تحتاج إلى إضافة ملف lib إلى التبعيات الإضافية مجال رابط المشروع الإعدادات.
للربط مع مكتبة ، يمكنك إما:
- قم بإدراجها في Project-> Properties ...-> Linker ، input-> تعتمدات إضافية (أدلة VC ++ تتيح لك فقط استخدام اسم .lib بدلاً من المسار الكامل) ،
- أضف مشروع المكتبة إلى تطبيقك. الحل (على الحل ، انقر بزر الماوس الأيمن -> إضافة -> المشروع الحالي ...) ، ثم استخدم Project -> Project Reporancies ... ، ثم تحقق من مشروع المكتبة الخاص بك (تأكد من تحديد مشروع التطبيق في المنسدلة). ربما تكون هذه هي أفضل طريقة للذهاب إذا كنت تقوم بتحرير كلا المشروعين ، حيث سيقوم VC ++ بإعادة بناء المكتبة إذا تغيرت قبل إنشاء تطبيقك.
إذا كنت متأكدًا من أنك ستستخدم فقط VC ++ ،
#pragma comment(lib,"C:\\path\\to\\library.lib")`
(شكرًا @nils)
NB: يبدو من الغريب جدًا أن يكون لديك مجلد حل المكتبة الخاص بك داخل دليل "تضمين": وهو مخصص حقًا لـ *.h (أو غيره #include
ملفات D).
من سطر الأوامر:
CL /EHSC {OBJFILES}+ /LINK /LIBPTH
حيث {objfiles}+ يعني ملف أو أكثر من ملفات أو CPP.
لا تربط VC ببساطة المكتبة إذا قمت بتضمين ملف الرأس.
عليك أن تخبر الرابط باستخدام المكتبة. لأسباب وجيهة: لديك الآلاف من libs في مجلد مكتبتك. إذا كان على MSVC البحث جميعًا في كل مرة تقوم فيها بربط برنامجك ، فسيتعين عليها أن تتجول من خلال Hundrets of Megabytes من البيانات.
سيستغرق ذلك بعض الوقت ، وبالتالي لم يتم ذلك افتراضيًا.
بالنسبة لـ VC ، يمكنك أيضًا إعطاء تلميح للرابط داخل المصدر الخاص بك. للقيام بذلك ، يمكنك إضافة السطر التالي في مكان ما في رمز المصدر الخاص بك (قد يكون رأس LIB مكانًا جيدًا).
#pragma comment(lib,"c:\\path_to_library\\libname.lib")
هذا ليس منصة مستقلة ولكن الطريقة الأكثر ملاءمة للحصول على LIB مرتبطة تلقائيًا بمشروع باستخدام MSVC.
طريقة أخرى هي ببساطة إضافة الرابط إلى إعدادات المشروع. يمكن العثور على المعلومات ذات الصلة Lin The Linker Protects of Your Project. لا تنس إضافة LIB إلى تكوينات الإصدار والتصحيح.