لماذا لا يوجد رابط G ++ مع المكتبة الديناميكية التي أقوم بإنشاءها؟
-
18-09-2019 - |
سؤال
أحاول إجراء بعض التطبيقات التي تعتمد جميعها على نفس المكتبة، وكانت المكتبات الديناميكية فكرتي الأولى: لذلك بدأت في كتابة "المكتبة":
/* ThinFS.h */
class FileSystem {
public:
static void create_container(string file_name); //Creates a new container
};
/* ThinFS.cpp */
#include "ThinFS.h"
void FileSystem::create_container(string file_name) {
cout<<"Seems like I am going to create a new file called "<<file_name.c_str()<<endl;
}
ثم جمع ثم "المكتبة"
g++ -shared -fPIC FileSystem.cpp -o ThinFS.o
ثم كتبت بسرعة ملف يستخدم المكتبة:
#include "ThinFS.h"
int main() {
FileSystem::create_container("foo");
return (42);
}
ثم حاولت تجميع ذلك مع
g++ main.cpp -L. -lThinFS
لكنه لن يترجم مع الخطأ التالي:
/usr/bin/ld: cannot find -lThinFS
collect2: ld returned 1 exit status
أعتقد أنني أفتقد شيئا واضحا للغاية، الرجاء مساعدتي :)
المحلول
-lfoo
يبحث عن مكتبة تسمى libfoo.a
(ثابت) أو libfoo.so
(مشترك) في مسار المكتبة الحالي، لذلك لإنشاء المكتبة، تحتاج إلى استخدام g++ -shared -fPIC FileSystem.cpp -o libThinFS.so
نصائح أخرى
يمكنك استخدام
g++ main.cpp -L. -l:ThinFS
سيستخدم استخدام "القولون" اسم المكتبة كما هو الحال، بدلا من ذلك يتطلب بادئة "Lib"
يجب أن يكون اسم ملف الإخراج libthinfs.so., ، على سبيل المثال
G ++ -Shared -fpic filesystem.cpp -o ليبthinfs.وبالتالي
نتائج g++ -shared -fPIC FileSystem.cpp
ليس ملف كائن، لذلك لا ينبغي أن ينتهي .o
. وبعد أيضا، يجب تعيين المكتبات المشتركة libXXX.so
. وبعد إعادة تسمية المكتبة وسيعمل.
تحقق من هذه المقالة.
http://www.yolinux.com/tutorials/libraryarchives-staticanddynamic.html.
مورد جيد حول كيفية بناء أنواع مختلفة من المكتبات. كما يصف كيف وأين لاستخدامها.