2010-07-16 14 views
11

Tôi nhận được lỗi trình liên kết sau khi tôi tạo ứng dụng của mình.Lỗi liên kết Q_OBJECT!

HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall CHIMyClass::metaObject(void)const " ([email protected]@@[email protected]@XZ) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual void * __thiscall CHIMyClass::qt_metacast(char const *)" ([email protected]@@[email protected]) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual int __thiscall CHIMyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@@[email protected]@@[email protected]) File not found : HIMyClass.obj

khai báo lớp của tôi là như

class CHIMyClass:public QDialog 
{ 
    Q_OBJECT 

    .... 

}; 

Khi tôi nhận xét Q_OBJECT lỗi mối liên kết đi tắt (và rõ ràng tôi không thể sử dụng tín hiệu và khe cắm). Tôi đang sử dụng Qt Creator như IDE và Qt 4.5.3. Khi tôi cung cấp cho Xây dựng lại tất cả, chắc chắn rằng QMake sẽ được gọi. Tôi đoán rằng, thế hệ của các tập tin moc_ * là nơi mà vấn đề nằm. Tôi đang sử dụng Windows XP và cl như trình biên dịch.

Lý do đằng sau lỗi liên kết này là gì?

+0

Có thể 'Không tìm thấy tệp: HIMyClass.obj' cho chúng tôi biết rằng Trình tạo Qt không thấy tệp moc/obj/temp? – mosg

+1

Thực sự, chạy lại qmake. Ngoài ra, hãy kiểm tra các ký tự "\" bị thiếu hoặc thừa trong tệp .pro của bạn. – andref

Trả lời

27

Lỗi này thường có nghĩa là bạn chưa thêm tiêu đề của lớp vào biến "HEADERS" trong tệp chuyên nghiệp (trình biên dịch đối tượng meta chỉ tạo tệp moc_ cho tiêu đề được liệt kê trong biến này). Hãy nhớ chạy qmake sau khi bạn thay đổi tệp .pro!

+0

Tệp tiêu đề tương ứng có sẵn dưới biến HEADERS vẫn gặp phải vấn đề mặc dù .. Đó không phải là lý do .. ít nhất là trong trường hợp của tôi .. :( – liaK

+2

Xóa bằng tay tất cả các tệp được tạo bởi qmake và tất cả các tệp đối tượng, sau đó chạy lại qmake – chalup

+1

@ chalup, tôi đã xóa tất cả các tệp MOC, OBJ, RCC và chạy qmake, bây giờ nó hoạt động tốt. Trong khi vui mừng rằng nó đã làm việc, điều này là điên rồ .. Tại sao như một hành vi không xác định? Bất kỳ đoán ?? – liaK

0

Kiểm tra xem các tùy chọn cấu hình Qt cần thiết có mặt trong file pro (QT += core gui ít nhất. Cũng thử bằng tay xóa tất cả mọi thứ được xây dựng/tạo ra trong thư mục xây dựng. Đôi khi nó xảy ra mà moc không chạy vì một lý do.

bạn cũng có thể thử cách chạy lệnh moc chính mình, và xem những gì nó ra (bạn có thể tìm thấy những dòng lệnh trong tab "biên dịch đầu ra" trong QtCreator

UPDATE:. thisliên quan vấn đề dường như đề nghị bạn don' t xác định QT_DLL khi biên dịch Bạn có thể thử một dự án QtCreator đơn giản và mới (với một widget mà subclasses mainwindow ví dụ) và thử điều đó. Nó sẽ chứa một tiêu đề Q_OBJECT tự động và cố gắng so sánh các tệp .pro và đầu ra trình biên dịch.

+0

Đó không phải là biểu tượng Qt bị thiếu, mà là biểu tượng được tạo bởi moc cho lớp của riêng mình. Vì vậy, tôi muốn đi với chalup và kiểm tra các tiêu đề được liệt kê trong HEADERS. một công trình hoàn toàn sạch sẽ cũng có thể hữu ích. –

+0

Nó liên kết tốt với tất cả các lớp khác có macro [email protected], tôi đã bao gồm tệp trong phần HEADERS và đã thử xây dựng sạch hơn một lần .. Không may mắn mặc dù .. :( – liaK

1

Kiểm tra tệp MakeFile.debug và có thể HIMyClass không tồn tại.

Tôi chỉ đổi tên MakeFile.debug, Làm sạch dự án và xây dựng lại tất cả và biên dịch.

12

Tôi gặp sự cố tương tự và đã được giải quyết bằng phản hồi của andref. Trong QT Đấng Tạo Hóa Tôi chỉ đơn giản là:

  1. xây dựng/Làm sạch tất cả
  2. xây dựng/Chạy qmake
  3. xây dựng/Chạy
+0

Điều này đã sửa lỗi cho tôi – ThePosey

+0

qmake là lưu ý quan trọng;) –

1

tôi đã cùng một vấn đề nhưng trong trường hợp của tôi đó là không đủ để sạch -> xây dựng. Vì vậy, tôi đã phải xóa thủ công tất cả các tập tin được tạo trong quá trình xây dựng (Mekefiles, ui mô tả trong cpp, và thường toàn bộ thư mục được tạo bởi quá trình xây dựng) và chỉ sau đó xây dựng succeded.

0

trên hộp osx của tôi điều này là do thiếu tệp * moc. tôi đã khắc phục sự cố này bằng cách xóa bom khỏi tệp .pro được mã hóa utf-8 của tôi. tôi sẽ gửi lỗi với qt.

lỗi cho tìm kiếm goggle ... LƯU Ý: thiếu vtable thường có nghĩa là hàm thành viên ảo không nội tuyến đầu tiên không có định nghĩa.

"vtable for MainWindow", referenced from:

MainWindow::MainWindow(QWidget*)in mainwindow.o 
1

Kể từ khi viết bài này, tôi đã sửa lại

tôi thấy rằng tôi cần phải chạm vào tập tin .pro trước khi xây dựng lại, tức là

  1. Thêm ký tự ngẫu nhiên
  2. Lưu
  3. Xóa các ký tự ngẫu nhiên
  4. Lưu
  5. Xây dựng dự án

Bước 1 - 4 dường như làm mất hiệu lực bất kỳ tệp moc * cũ nào buộc qmake để tạo lại chúng. Nếu không, một dự án xây dựng lại dường như sử dụng các tệp * cũ *.

[EDIT] Đã cập nhật câu trả lời.

Kể từ khi viết bài đăng này, tôi đã khá nhiều là clean, qmake rồi build. Các qmake là quan trọng vì nó tái tạo các tập tin moc * mà bạn cần nếu bạn đang thay đổi tập tin .h của bạn và thay đổi kế thừa của bạn chống lại Q_OBJECT. Trong thực tế, trong một số trường hợp, thậm chí bạn có thể chỉ cần thực hiện qmake rồi build để xây dựng gia tăng.

0

tôi tìm thấy một nguyên nhân có thể và giải pháp cho lỗi này

Lỗi này cũng sẽ xảy ra nếu ai đã tuyên bố khe trong .h tập tin nhưng chưa được xác định cơ thể của mình trong việc thực hiện

0

Tôi có vấn đề này . Xác minh xem có mô tả về việc triển khai vị trí trong tệp .cpp hay không.

0

Tôi đã xóa #include "main.moc" khỏi tệp chính của mình và quên thêm lại ... Đó là thời gian vui vẻ!

0

Câu trả lời từ @chalup và @ierax đã giúp tôi. Tôi đã phải đóng người tạo Qt và mở nó lại mặc dù qmake có hiệu lực. Tôi đã làm theo các bước sau: 1. Đã chuyển định nghĩa lớp sang tệp tiêu đề. 2. Thêm tập tin tiêu đề để dự án và đảm bảo nó được liệt kê chống lại HEADERS + = \ danh sách trong tập tin .pro. 3. Làm sạch tất cả 4. đóng QtCreator (trên Windows 10) 5. Xóa Makefiles khỏi thư mục dự án 6. Mở QtCreator và mở dự án. 7. Qmake để đảm bảo makefiles được tạo ra. 8. Xây dựng lại tất cả

Các bước này đã giúp tôi giải quyết vấn đề này - Tôi đã gặp khó khăn trong hơn một giờ với nhiều câu trả lời và phương pháp khác không có tác dụng. Trước khi bạn chạy qmake, hãy đảm bảo bạn xóa các tệp makefiles và đóng QtCreator (ít nhất là áp dụng trên các cửa sổ 10).