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?
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
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