2010-01-07 14 views
5

Chúng tôi đã biên dịch QT 4.6 và QWT 5.2.0 cho VS2005.Qt, VS2005, Qwt - Không thể sử dụng Q_OBJECT trong lớp bắt nguồn từ các tiện ích Qwt

Chúng tôi đang cố gắng lấy được một lớp từ QwtDial và lớp dẫn xuất có các vị trí. Vì vậy, chúng ta cần thêm macro Q_OBJECT. Tuy nhiên, khi chúng tôi làm điều đó, mối liên kết nghẹn ra lỗi này:

lỗi LNK2001: chưa được giải quyết biểu tượng bên ngoài "công cộng: static struct QMetaObject const QwtDial :: staticMetaObject" (? StaticMetaObject @ QwtDial @@ 2UQMetaObject @@ B)

Tôi đã xem xét các Qwt.dll với phụ thuộc, và nó có chức năng đó. Nhìn vào tập tin .lib với một trình soạn thảo hex cho thấy nó có một kết hợp chính xác cho chuỗi mang tên đó.

Chúng tôi có lib Qwt trong đường dẫn. Trên thực tế, nếu tôi đổi tên lib, sau đó nó đưa ra một lỗi mà nó không thể tìm thấy tập tin lib. Vì vậy, chúng tôi biết nó đang xem xét đúng lib.

Nếu chúng ta bỏ qua Q_OBJECT, thì mọi thứ liên kết và vẽ chính xác bằng cách sử dụng một số tiện ích QWT, bao gồm các lớp có nguồn gốc QwOB không phải Q_OBJECT của chúng tôi.

Có ai biết điều gì có thể gây ra vấn đề liên kết gây phiền toái này không?

UPDATE:

tôi đã xác minh rằng lớp tôi thêm các Q_OBJECT để chắc chắn là nhận được một tập tin MOC tạo ra cho nó. Lỗi trình liên kết thực sự đến từ tệp MOC được tạo này:

moc_GaugeWidget1.obj : error LNK2001: unresolved external symbol "public: static 
    struct QMetaObject const QwtDial::staticMetaObject" 
    ([email protected]@@[email protected]@B) 

Vì vậy, nó trông giống như một thứ khá lạ và không điển hình. Biểu tượng chắc chắn là trong lib.

Trả lời

11

Tôi gặp vấn đề tương tự. Vâng, tôi đang cập nhật một dự án cũ bằng cách sử dụng Qt4.4 và VC2003, và tôi đang sử dụng QwtPlot thay vì QwtDial. Lỗi này là:

LNK2001: biểu tượng bên ngoài chưa được giải quyết "công cộng: static struct QMetaObject const QwtPlot :: staticMetaObject" (staticMetaObject @ QwtPlot @@ 2UQMetaObject @@ B?)

Chỉ cần đó. Không có gì khác. Tôi đã tìm thấy tài liệu tham khảo diễn đàn trỏ đến các vấn đề với bản sửa lỗi gỡ lỗi/phát hành và có thể có liên quan đến việc xóa trình cắm Qt Designer.

Điều này có vẻ phù hợp với tôi: Thêm dòng: "DEFINES + = QWT_DLL" vào đầu tệp project.pro.

qmake project.pro

nmake phát hành

+1

+1: Cảm ơn, nó đã giúp! Tôi nghĩ rằng, một chuyển đổi xác định là mất tích trong QWT. Một cái gì đó như "nếu sử dụng trong thư viện này, đặt QWT_DLL để Q_DECL_EXPORT, khác đặt QWT_DLL để trống". Đó là lý do tại sao bạn nên đặt QWT_DLL để trống theo cách thủ công nếu sử dụng các tiêu đề QWT. –

+0

Cảm ơn bạn, nó hoạt động thực sự! –

1

Tôi không chắc chắn về câu trả lời này, nhưng đây là một số thông tin sau:

Dường như với tôi rằng lớp được thừa kế của bạn không có một kết hợp moc_ nộp! Các tệp moc thường được sử dụng khi sử dụng macro Q_OBJECT ... Thông tin moc của dự án của bạn được lưu trữ trong các tệp Makefile, Makefile.debug và Makefile.release! Đây là tập tin cho biết tệp .cpp nào cần tệp moc và không.

Bạn có thể tìm tài liệu trên moc trong QtAssistant: http://qt.nokia.com/doc/4.6/moc.html

Bây giờ, để kiểm tra điều này, bạn cần phải đi trong bạn "tạo ra" thư mục và tìm kiếm một tập tin có tên là "moc_yourDerivedClass.cpp".

Nếu bạn không thể tìm thấy tệp phù hợp nào, bạn cần thực hiện lại quy trình qmake với yourderivedClass ... Có thể khi bạn sử dụng qmake đầu tiên, macro Q_OBJECT không nằm trong lớp và do đó, không có moc tệp đã được tạo ...

Tôi hy vọng nó sẽ giúp bạn một chút!

+0

Tôi sẽ đề nghị bạn một cái gì đó, nó có thể không thực hiện được, nhưng sẽ có thể hữu ích cho các dự án tương lai. Tôi đang sử dụng một gói kịch bản mà một người bạn của tôi phát triển. Bạn có thể tìm thấy ở đây: http://www.dprog.net/joomla/index.php?option=com_content&view=article&id=39:qt-integration-scripts&catid=32:qt-integration-scripts&Itemid=47 Có là một công việc nhỏ cần làm để thiết lập, như chỉ định VS bạn đang sử dụng, phiên bản Qt nào, tệp .PRO của bạn, v.v ... Và sau đó mọi thứ khác được thực hiện tự động, thêm tệp mới được thêm, tạo. Các tệp PRI, tệp vcproj ... Nó thực sự tốt ... –

+0

Với gói đó, ví dụ, khi tôi thêm một tệp, tôi đặt nó vào đúng thư mục, bên cạnh tệp .PRO của tôi. Tôi khởi động một trong những kịch bản được gọi là "generate_vcproj.bat" và các kịch bản tạo ra tất cả mọi thứ ... Sau đó, tôi sử dụng "Launch_ide.bat" và VS của tôi ra mắt chính nó với tất cả các thiết lập (tập tin moc là tốt;)) –

+0

Đối với câu trả lời này , không ... chắc chắn có một tập tin MOC cho việc này. (moc_GaugeWidget1.obj: lỗi LNK2001: biểu tượng bên ngoài chưa được giải quyết "công khai: cấu trúc tĩnh QMetaObject const QwtDial :: staticMetaObject" (? staticMetaObject @ QwtDial @@ 2UQMetaObject @@ B)) ... vì vậy, có một số vấn đề khác/lỗi đang xảy ra. – darron

1

Vấn đề là với moc file.You nên sử dụng Q_DECL_EXPORT (hoặc một số điều khác giống như nó) trong QwtPlot nét mà nói với trình biên dịch lớp này là có thể sử dụng bằng thư viện khác nhưng các phần của lớp được tạo ra trong tập tin moc không chứa những thứ này vì vậy khi bạn liên kết các thư viện này với chương trình khác, nó không biết cách liên kết các phần đó. Dù sao tôi không có bất kỳ ý tưởng làm thế nào để nói với các Qt!

1

Chính xác cùng một vấn đề ở đây với qwt 5.2.1, qt 4.6 và VS2008. cùng một mã biên dịch hoàn hảo trong Linux. Tất cả các tệp moc được tạo và xử lý đúng cách, không có thư viện hỗn hợp phát hành/gỡ lỗi nào ở đó, tôi sẽ báo cáo nó với các lỗi qwt khi tôi có thời gian.

thêm QWT_DLL vào danh sách các định nghĩa (thuộc tính dự án-> C++ -> preprocessor-> definitions) thực sự giải quyết được vấn đề!

0

Thử chạy lại qmake trong thư mục dự án.

$ qmake -project

$ qmake -tp vc

Đây là những gì cố định các vấn đề đối với tôi. Đọc những lời giải thích của "có vẻ như bạn có một vấn đề tập tin moc", mà nhiều người đã đưa ra, để lại cho tôi không rõ ràng về những gì để làm.

Tôi nghĩ rằng tôi đã gây ra sự cố của riêng mình về vấn đề này. Tôi đã nhấp chuột phải và biên dịch tập tin .ui trong dự án của tôi trước khi xây dựng toàn bộ dự án. Bằng cách nào đó mà không hoàn toàn tạo ra tất cả các tập tin cần thiết. Dù sao, chạy qmake là một điều hữu ích để làm nếu bạn đột nhiên gặp phải những vấn đề mà trước đây không có.

Tuy nhiên, có một điều khác tôi nhận thấy trong cài đặt dự án của mình, không có chỉ thị tiền xử lý nào được đặt. Chạy qmake một lần nữa cố định điều này.