2009-07-16 35 views
11

Tôi mới sử dụng Qt và có một lỗi mà tôi không thể khắc phục được.Lỗi tham chiếu không xác định Qt/mingw32 ... không thể liên kết .lib

Tôi có một nhóm cửa sổ (VS2005) tệp thư viện tĩnh (.lib). Và tôi đang thử nghiệm nếu họ làm việc tốt với Qt. Vì vậy, tôi đã lấy thư viện đơn giản nhất mà tôi có. (Được gọi là MessageBuffer).

Vì vậy, tôi đã thêm MessageBuffer.h vào main.cpp và thêm vị trí của những tệp đó vào INCLUDEPATH của .pro.

Cho đến lúc đó mọi thứ có vẻ ổn, tôi có thể sử dụng lớp và IDE Qt hiển thị tất cả phương thức và mọi thứ. Vì vậy, với tôi nó trông giống như nó tìm thấy tập tin .h.

Bây giờ tôi thêm MessageBuffer.lib (VS2005/Debug xây dựng) trong .pro như thế này:

LIBS += E:/SharedLibrary/lib/MessageBufferd.lib 

Tôi cũng đã thử như sau:

win32:LIBS += E:/SharedLibrary/lib/MessageBufferd.lib 
LIBS += -LE:/SharedLibrary/lib -lMessageBufferd 
win32:LIBS += -LE:/SharedLibrary/lib -lMessageBufferd 

Dưới đây là nội dung của tập tin .pro của tôi :

QT += opengl 
TARGET = SilverEye 
TEMPLATE = app 
INCLUDEPATH += E:/SharedLibrary/MessageBuffer 
SOURCES += main.cpp \ 
    silvereye.cpp 
HEADERS += silvereye.h 
FORMS += silvereye.ui 
OTHER_FILES += 
win32:LIBS += E:/SharedLibrary/lib/MessageBufferd.lib 

Tất cả đều cho tôi cùng một công cụ xóa rs: (và tôi nhận được cùng một ngay cả khi tôi không bao gồm các .lib)

Running build steps for project SilverEye... 
Configuration unchanged, skipping QMake step. 
Starting: C:/Qt/2009.03/mingw/bin/mingw32-make.exe -w 
mingw32-make: Entering directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye' 
C:/Qt/2009.03/mingw/bin/mingw32-make -f Makefile.Debug 
mingw32-make[1]: Entering directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye' 
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\SilverEye.exe debug/main.o debug/silvereye.o debug/moc_silvereye.o -L"c:\Qt\2009.03\qt\lib" -lopengl32 -lglu32 -lgdi32 -luser32 -lmingw32 -lqtmaind E:/SharedLibrary/lib/MessageBufferd.lib -lQtOpenGLd4 -lQtGuid4 -lQtCored4 
mingw32-make[1]: Leaving directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye' 
mingw32-make: Leaving directory `C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye' 
debug/main.o: In function `Z5qMainiPPc': 
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:12: undefined reference to `MessageBuffer::MessageBuffer()' 
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:13: undefined reference to `MessageBuffer::Append(char*, int)' 
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:17: undefined reference to `MessageBuffer::~MessageBuffer()' 
C:/Documents and Settings/JP/My Documents/QTProjects/SilverEye/main.cpp:17: undefined reference to `MessageBuffer::~MessageBuffer()' 
collect2: ld returned 1 exit status 
mingw32-make[1]: *** [debug\SilverEye.exe] Error 1 
mingw32-make: *** [debug] Error 2 
Exited with code 2. 
Error while building project SilverEye 
When executing build step 'Make' 

Bất cứ ai có thể giúp đỡ?

+0

Bạn có thể đăng file pro bạn đang sử dụng? –

+0

vừa thêm nội dung tệp chuyên nghiệp vào thư gốc. –

+0

cảm ơn. pro tập tin có vẻ tốt. –

Trả lời

5

Dựa trên câu hỏi Use libraries compiled with visual studio in an application compiled by g++ (mingw) và bài viết diễn đàn MSDN I can't mix VC & GCC nó không xuất hiện, bạn có thể liên kết một ứng dụng gcc với thư viện biên dịch C++ trực quan.

Giải pháp sẽ là biên dịch lại mọi thứ bằng cùng một trình biên dịch.

+0

Đây thực sự là những gì tôi sắp đăng, tôi thấy điều này: Các thư viện này, giống như nhiều gói phát triển Windows biên dịch sẵn khác chẳng hạn như thư viện máy khách MySQL, được biên dịch với Ms Visual C++ (MSVC). MSVC và MinGW, chúng tôi phát hiện ra, sử dụng các quy ước đặt tên khác nhau cho các hàm stdcall. MSVC xuất khẩu chúng dưới dạng _name @ ordinal, nhưng MinGW xuất chúng dưới dạng tên. Kết quả là, việc xây dựng MinGW không thành công với các lỗi liên kết "undefined references" khi gọi các hàm stdcall được xuất từ ​​thư viện MSVC. –

+0

Vui lòng xem tại đây để biết các giải pháp: http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-mingw-projects/ –

0

Tôi cho rằng bạn đã sử dụng thư viện MessageBuffer trong một ứng dụng khác có vấn đề. Lỗi có vẻ như nó hoặc là không thể tìm thấy thư viện hoặc lớp MessageBuffer không được xuất khẩu.

Bạn đã thử đặt -l ở phía trước thư viện trong tệp chuyên nghiệp chưa?

win32:LIBS += -lE:/SharedLibrary/lib/MessageBufferd.lib 

Xem khác answer. Tôi đã thêm câu trả lời khác bởi vì tôi không muốn làm cho câu trả lời này lộn xộn hơn nó đã được.

Cố gắng cho đến nay:

  • Không phải là một lỗi đánh máy, d được nối vào thư viện
  • Sử dụng phần mở rộng lib là đúng như đã thấy trong đầu ra
+0

d là tên thực tế, d được thêm vào cho phiên bản gỡ lỗi của .lib –

+0

@xcimo có ý nghĩa ... chỉ muốn kiểm tra –

+0

Tôi không biết nếu lớp MessageBuffer được xuất. Tôi không có bất kỳ từ khóa "xuất khẩu" trong lớp messageBuffer, vì tôi đã có thể sử dụng thư viện này trong nhiều dự án Visual Studio C++ khác. Có một thư viện tĩnh cần xuất khẩu không? hoặc có thể một cái gì đó của nó mà mingw cần? Cảm ơn bạn đã giúp đỡ. –

4

Các MinGW FAQ thảo luận về vấn đề này và cung cấp một giải pháp:

  1. Tạo một file định nghĩa sử dụng reimp (đối với file lib) hoặc pexports (cho các tập tin dll).
  2. Xóa tiền tố gạch dưới khỏi các hàm stdcall.
  3. Sử dụng dlltool để chuyển đổi thư viện MSVC thành thư viện MinGW với định nghĩa mới.

Điều đó không hiệu quả. Cuối cùng, chúng tôi đã xóa các bộ phận khỏi các tên hàm, khiến nó biên dịch. Nhưng chương trình sẽ không chạy vì chương trình không thể tìm thấy các hàm được liên kết trong tệp DLL. Cuối cùng, sau khi tham khảo tài liệu MSDN cho tệp định nghĩa, chúng tôi đã thay đổi hướng dẫn tạo:

  1. Tạo tệp định nghĩa bằng cách sử dụng reimp.
  2. Đối với mỗi hàm stdcall (được định dạng là _name @ ordinal), thêm một tên dòng = _name @ ordinal, cho phép MinGW ánh xạ quy ước đặt tên stdcall của nó thành MSVC.
  3. Sử dụng dlltool để chuyển đổi thư viện MSVC thành thư viện MinGW với định nghĩa mới.

Đã hoạt động! Để biên soạn dự án, bạn chỉ cần:

  1. Tải xuống và cài đặt gói Qt/Windows, bao gồm MinGW.
  2. Tải xuống lại và thả nó vào thư mục MinGW/bin.
  3. Tải xuống gói phát triển cho thư viện của bên thứ ba và trỏ biến môi trường đến vị trí đó.
  4. Tạo dự án bằng lệnh qmake/make thông thường.

Trích từ: http://blog.outofhanwell.com/2006/05/01/linking-msvc-libraries-with-mingw-projects/

+0

Tôi hiện đang thử plugin studio trực quan cho QT, để thử để xây dựng ứng dụng QT và sử dụng trình biên dịch VS (và sử dụng MSVC .libs của tôi) –

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