2013-05-31 60 views
5

Tôi có vấn đề sau đây: Tôi sử dụng một số lớp như sau để khởi C thư viện:liên kết tĩnh của C++

class Hello 
{ 
public: 
    Hello() 
    { 
    cout << "Hello world" << endl; 
    } 

    ~Hello() 
    { 
    cout << "Goodbye cruel world" << endl; 
    } 

} hello_inst; 

Nếu tôi bao gồm mã này trong một tập tin hello.cc và biên dịch nó cùng với khác tệp chứa chính của tôi(), sau đó hello_inst được tạo trước và bị hủy sau khi gọi thành main(). Trong trường hợp này, nó chỉ in một số dòng, trong dự án của tôi, tôi khởi tạo libxml qua LIBXML_TEST_VERSION.

Tôi đang tạo nhiều tệp thực thi chia sẻ nhiều mã giống nhau trong dự án cmake. Theo chủ đề này: Adding multiple executables in CMake Tôi đã tạo một thư viện tĩnh chứa mã được hiển thị ở trên và sau đó liên kết các tệp thi hành với thư viện đó. Thật không may trong trường hợp đó hello_inst không bao giờ được tạo (và libxml2 chưa bao giờ được khởi tạo). Làm cách nào để khắc phục sự cố này?

+0

bạn có thể hiển thị tệp chính của mình không? –

+0

Tôi không nghĩ rằng tập tin chính là quan trọng. Bằng mọi cách viết 'int main() {return 0;}' – hfhc2

+0

Có lẽ không phải những gì bạn đang tìm kiếm, nhưng bạn có thể giữ mã khởi tạo như thế này một cách riêng biệt và sau đó biên dịch các tập tin thực thi với static + init. –

Trả lời

1

Tôi đã có một vấn đề tương tự và giải quyết nó bằng cách định nghĩa các thư viện của tôi như là tĩnh. Vì vậy tôi đã sử dụng đoạn mã sau:

add_library(MyLib SHARED ${LBMLIB_SRCS} ${LBMLIB_HEADER}) 

Có lẽ đây sửa chữa vấn đề của bạn

+0

Vâng, nếu tôi sẽ gửi/cài đặt các chương trình, tôi sẽ phải cài đặt thư viện là tốt, wouldn Tôi? – hfhc2

+0

Vâng, đó là nhược điểm của phương pháp này. Nhưng tôi đã có một vấn đề tương tự và không tìm thấy một giải pháp khác. – tune2fs

0

Không có cách chính thức nào để buộc các biến chung được tạo ra bởi các biến toàn cục và được trình biên dịch phụ thuộc.

Thông thường việc này được thực hiện lần đầu tiên trong thư viện đó thực sự được sử dụng (Lớp, hàm hoặc biến) hoặc khi biến được sử dụng thực sự.

Nếu bạn muốn bắt buộc hello_inst được sử dụng, hãy gọi hàm trên đó, sau đó xem liệu và khi nào hàm tạo và hàm hủy được gọi.

đã đọc chủ đề này để biết thêm thông tin: http://www.gamedev.net/topic/622861-how-to-force-global-variable-which-define-in-a-static-library-to-initialize/

+0

Vâng, nhưng sau đó tôi cũng có thể khởi tạo thư viện trong chính của tôi(), ý tưởng là sử dụng RAII ... – hfhc2

0

Theo như tôi biết, tĩnh học được định nghĩa trong thư viện nên được xây dựng trước khi chính được gọi là và bị phá hủy sau khi chính, theo cách thức Bạn miêu tả. Thật vậy, tôi đã sử dụng các thư viện được chia sẻ trong nhiều dự án và chưa bao giờ gặp phải các vấn đề bạn mô tả. Tôi hiểu một tệp thư viện, ít hơn một vùng chứa tệp đối tượng. Tuy nhiên, điều đó nói .....

Nếu mã của bạn không làm gì với đối tượng được tạo, trình liên kết sẽ tự do xóa nó (xóa mã chết). Tôi sẽ đề nghị đảm bảo đối tượng tĩnh được tham chiếu. Gọi một chức năng thành viên, có lẽ?

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