2013-03-20 31 views
5

Trong một dự án đã tồn tại và khá lớn, tôi đang bật tối ưu hóa trình biên dịch gcc O1.Lỗi C++ Linker khi sử dụng tối ưu hóa O1

Nếu không có tùy chọn này, mọi thứ đều được xây dựng, liên kết và chạy tốt. với tùy chọn được bật, các biên dịch và liên kết thực thi chính, nhưng tôi gặp lỗi liên kết khi liên kết một trong các kiểm tra đơn vị.

Giữa 2 lần chạy biên dịch này, tôi không thay đổi bất kỳ mã nào hoặc tạo tệp, chỉ có cờ tối ưu hóa O1.

Các lỗi mà tôi nhận được là:

Configuration.a(Builder.o): In function `Builder::Create() const': 
Builder.cpp:123: undefined reference to `Factory::Instance()' 

Một nơi nào đó trong quá trình liên kết, nó gặp dòng này (dòng 123) của Builder.cpp: tập tin cpp

pObject = Factory::Instance()->CreateObject(); 

(Bên cạnh những lỗi mối liên kết của hàm Instance, tôi cũng nhận được một hàm từ hàm CreateObject)

Khi tôi xem xét thứ e Factory, tôi thấy: tập tin tiêu đề

class Factory { public: 
    static Factory* Instance(); << rest of the file >> 

Và trong file cpp

Factory* Factory::sInstance = 0; 

Factory* Factory::Instance() { 
    // Check if this is the first call 
    if (sInstance == 0) 
    { 
     // Create only instance 
     sInstance = new Factory(); 
    } 

    // Address of the instance 
    return sInstance; } 

Trước tiên tôi thử một sạch và xây dựng lại, nhưng điều đó không làm gì cả. cũng tôi đã sử dụng nm để tạo các khối của các ký hiệu đã sử dụng là Factory.o (một và không có tối ưu hóa) và so sánh chúng.

Tôi thấy rằng một số biểu tượng bị xóa, chứ không phải là một biểu tượng Factory::Instance(). Tôi thấy một cái gì đó với địa chỉ thay đổi liên quan đến chức năng này, nhưng tôi sẽ không nghĩ rằng đó là một vấn đề.

Cũng thông qua Google Tôi tìm thấy một vài khả năng, nhưng tôi không thể tìm thấy điều gì đó phù hợp với vấn đề của tôi.

có ai có ý tưởng về cách tìm sự cố này không?

+2

Phiên bản trình biên dịch? Làm thế nào để bạn biên dịch nó (là makefile đủ ngắn để đăng bài?)? Bạn đã chắc chắn rằng đó là điều duy nhất bạn thay đổi (tức là, nếu bạn lấy '-O1' trở lại, nó sẽ biên dịch lại)? – us2012

+0

Ngoài việc thiếu tên an toàn và đặt tên gây hiểu lầm ('Nhà máy' thực sự là một thứ gì đó giống như một singleton), tôi thấy không có gì đáng bị phản đối trong mã bạn đã hiển thị.Nếu '-O1' thực sự là điều duy nhất bạn thay đổi, điều này sẽ hoạt động tốt. Trừ khi có một mệnh đề có điều kiện trong makefile mà không biên dịch 'factory.cpp' hoặc một cái gì đó khi tối ưu hóa được bật, nhưng điều đó sẽ là một chút vô lý (có thể khá nhiều quy tắc đó ra!). – Damon

Trả lời

1

Configuration.a (Builder.o): Trong chức năng Builder::Create() const': Builder.cpp:123: undefined reference to Factory :: Instance()'

Vì bạn đã xác minh rằng Factory::Instance()được quy định tại Factory.o, và kể từ khi bạn là rõ ràng sử dụng thư viện lưu trữ, quả cầu pha lê của tôi cho biết bất kỳ thư viện nào chứa Factory.o đều nằm trên dòng lệnh trướcConfiguration.a, trong khi đó phải là sau.

Thứ tự của thư viện lưu trữ trên dòng lệnh matters.