لماذا لا يوجد رابط G ++ مع المكتبة الديناميكية التي أقوم بإنشاءها؟

StackOverflow https://stackoverflow.com/questions/2001141

  •  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.

مورد جيد حول كيفية بناء أنواع مختلفة من المكتبات. كما يصف كيف وأين لاستخدامها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top