Почему 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
Хороший ресурс о том, как создавать различные типы библиотек.В нем также описывается, как и где их использовать.