2012-10-05 40 views
15

Tôi đang thực hiện một C++ Thư viện chia sẻ và khi tôi biên soạn một exe chính có sử dụng thư viện trình biên dịch mang lại cho tôi:C++ thư viện chia sẻ không xác định tài liệu tham khảo cho `FooClass :: SayHello()'

main.cpp:(.text+0x21): undefined reference to `FooClass::SayHello()' 
collect2: ld returned 1 exit status 

Thư viện đang :

fooclass.h

#ifndef __FOOCLASS_H__ 
#define __FOOCLASS_H__ 

class FooClass 
{ 
    public: 
     char* SayHello(); 
}; 

#endif //__FOOCLASS_H__ 

fooclass.cpp

#include "fooclass.h" 

char* FooClass::SayHello() 
{ 
    return "Hello Im a Linux Shared Library"; 
} 

Biên soạn với:

g++ -shared -fPIC fooclass.cpp -o libfoo.so 

chính: main.cpp

#include "fooclass.h" 
#include <iostream> 

using namespace std; 

int main(int argc, char const *argv[]) 
{ 
    FooClass * fooClass = new FooClass(); 

    cout<< fooClass->SayHello() << endl; 

    return 0; 
} 

Biên soạn với:

g++ -I. -L. -lfoo main.cpp -o main 

Chiếc máy là một Ubuntu Linux 12

Cảm ơn!

+2

Thư viện ở cuối lệnh trình biên dịch. Xem http://stackoverflow.com/questions/9966959/noobish-linker-errors-when-compiling-against-glib/9966989#9966989 – hmjd

+0

Không viết các nhân viên bảo vệ (hoặc bất kỳ tên nào khác) có chứa hai dấu gạch dưới hoặc bắt đầu bằng dấu gạch dưới theo sau là một chữ cái viết hoa. Những tên này được dành riêng cho việc triển khai. (Điều này có lẽ không liên quan đến câu trả lời đúng cho câu hỏi) –

+0

@close cử tri: Tôi nghĩ câu hỏi này hay hơn câu hỏi khác (trước hết, tiêu đề không mang tính mô tả, và thứ hai, cái kia có một tấn rác không liên quan) – Wug

Trả lời

27
g++ -I. -L. -lfoo main.cpp -o main 

là sự cố. Các phiên bản gần đây của GCC yêu cầu bạn đặt các tệp đối tượng và thư viện theo thứ tự mà chúng phụ thuộc lẫn nhau - như một quy tắc chung của ngón tay cái, bạn phải đặt cờ thư viện làm công tắc cuối cùng cho trình liên kết; tôi. Ví dụ: viết

g++ -I. -L. main.cpp -o main -lfoo 

thay thế.

+0

Cảm ơn! đã giải quyết được vấn đề. – fivunlm

+3

Bất kỳ ý tưởng làm thế nào chúng ta có thể xác định điều này bằng cách sử dụng qmake? –

+0

Câu trả lời hay! Trong một thời gian dài tôi không tự thông qua cmdline xây dựng dự án mẫu. Và ngay bây giờ tôi dành 1 giờ cố gắng để tìm ra ý nghĩa của "tham chiếu không xác định" trong quá trình biên dịch với gcc-6. Vấn đề là ở chỗ bạn đã mô tả ở đây! – bruziuz

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