Why doesn't g++ link with the dynamic library

2019-04-29 05:49发布

I've been trying to make some applications which all rely on the same library, and dynamic libraries were my first thought: So I began writing the "Library":

/* 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;
}

I then compile the "Library"

g++ -shared -fPIC FileSystem.cpp -o ThinFS.o

I then quickly wrote a file that uses the Library:

#include "ThinFS.h"
int main() {
    FileSystem::create_container("foo");
    return (42);
}

I then tried to compile that with

g++ main.cpp -L. -lThinFS

But it won't compile with the following error:

/usr/bin/ld: cannot find -lThinFS
collect2: ld returned 1 exit status

I think I'm missing something very obvious, please help me :)

5条回答
男人必须洒脱
2楼-- · 2019-04-29 05:56

the name of the output file should be libThinFS.so, e.g.

g++ -shared -fPIC FileSystem.cpp -o libThinFS.so
查看更多
孤傲高冷的网名
3楼-- · 2019-04-29 05:58

-lfoo looks for a library called libfoo.a (static) or libfoo.so (shared) in the current library path, so to create the library, you need to use g++ -shared -fPIC FileSystem.cpp -o libThinFS.so

查看更多
放我归山
4楼-- · 2019-04-29 06:02

You can use

g++ main.cpp -L. -l:ThinFS 

The use of "colon" will use the library name as it is, rather requiring a prefix of "lib"

查看更多
一夜七次
5楼-- · 2019-04-29 06:07

The result of g++ -shared -fPIC FileSystem.cpp is not an object file, so it should not end with .o. Also, shared libraries should be named libXXX.so. Rename the library and it will work.

查看更多
看我几分像从前
6楼-- · 2019-04-29 06:07

Check out this article.

http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

A good resource on how to build different types of libraries. It also describes how and where to use them.

查看更多
登录 后发表回答