2010-01-04 22 views
6

Tôi đã cố gắng để làm cho một số ứng dụng mà tất cả dựa vào cùng một thư viện và thư viện động là suy nghĩ đầu tiên của tôi: Vì vậy, tôi bắt đầu viết "Thư viện":Tại sao không liên kết g ++ với thư viện động mà tôi tạo?

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

tôi sau đó biên dịch "Thư viện"

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

tôi sau đó nhanh chóng viết một tập tin có sử dụng thư viện:

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

sau đó tôi đã cố gắng để biên dịch rằng với

g++ main.cpp -L. -lThinFS 

Nhưng nó sẽ không biên dịch với các lỗi sau:

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

Tôi nghĩ rằng tôi là thiếu một cái gì đó rất rõ ràng, hãy giúp tôi :)

Trả lời

11

-lfoo tìm kiếm một thư viện gọi libfoo.a (tĩnh) hoặc libfoo.so (chia sẻ) trong đường dẫn thư viện hiện nay, vì vậy để tạo ra thư viện, bạn cần phải sử dụng g++ -shared -fPIC FileSystem.cpp -o libThinFS.so

+0

Cảm ơn, các lib đã mất tích ở phía trước (.o thay vì .so chỉ là một lỗi đánh máy) :) – lazlow

3

tên của tập tin đầu ra phải là libThinFS.so, ví dụ

 
g++ -shared -fPIC FileSystem.cpp -o libThinFS.so 
1

Kết quả của g++ -shared -fPIC FileSystem.cpp không phải là một tập tin đối tượng, vì vậy không nên kết thúc với .o. Ngoài ra, thư viện được chia sẻ phải có tên là libXXX.so. Đổi tên thư viện và nó sẽ hoạt động.

6

Bạn có thể sử dụng

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

Việc sử dụng "ruột" sẽ sử dụng tên thư viện như nó có, chứ không phải đòi hỏi một tiền tố của "lib"

Các vấn đề liên quan