2012-04-18 84 views
5

Tôi đang cố gắng biên dịch một tệp nguồn C++ test.cpp đơn lẻ, có một mã rất đơn giản thể hiện pthread_create(); pthread_cond_signal/pthread_cond_wait() chức năng.Lỗi trình liên kết trong việc biên dịch mã pthread đơn giản trong MingW

Tôi đã cài đặt Mingw/Ansys trên Windows XP nơi tôi đang làm việc. Trong cửa sổ MinGW tôi làm:

g++ -IC:/MinGW/include/ -lpthread test.cpp 
//-IC:/MinGW/include to get pthread.h 
//-LC:/MinGW/bin to get pthreadGC2.dll 

Các cpp bao gồm pthread.h như:

#include <pthread.h> 

Nhưng điều này đã cho tôi nhiều mối liên kết lỗi không xác định tài liệu tham khảo cho tất cả các chức năng thư viện pthread.

Tôi đang làm gì sai ở đây. Có thể xây dựng mã pthread trên môi trường MingW trên windows hay không?

Cách khắc phục lỗi này?

C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x23): undefined reference to `_imp__pthread_mutex_lock' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x67): undefined reference to `_imp__pthread_cond_signal' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x75): undefined reference to `_imp__pthread_mutex_unlock' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x98): undefined reference to `_imp__pthread_exit' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0xbc): undefined reference to `_imp__pthread_mutex_lock' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0xe8): undefined reference to `_imp__pthread_cond_wait' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x10f): undefined reference to `_imp__pthread_mutex_unlock' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x135): undefined reference to `_imp__pthread_exit' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x153): undefined reference to `_imp__pthread_attr_init' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x169): undefined reference to `_imp__pthread_mutex_init' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x17f): undefined reference to `_imp__pthread_attr_setdetachstate' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x195): undefined reference to `_imp__pthread_cond_init' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x1bc): undefined reference to `_imp__pthread_create' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x1e3): undefined reference to `_imp__pthread_create' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x201): undefined reference to `_imp__pthread_join' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x21f): undefined reference to `_imp__pthread_join' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x239): undefined reference to `_imp__pthread_mutex_destroy' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x247): undefined reference to `_imp__pthread_cond_destroy' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x255): undefined reference to `_imp__pthread_attr_destroy' 
C:\DOCUME~1\ADESHP~1\LOCALS~1\Temp\ccUQhu7D.o:pthread_cond.c:(.text+0x263): undefined reference to `_imp__pthread_exit' 
collect2: ld returned 1 exit status 
+0

Các bản phân phối MinGW mà tôi đã sử dụng không đi kèm với thư viện pthread. Bạn có thực sự có một (một trong số đó có sẵn từ http://sourceware.org/pthreads-win32/) không? –

+0

@Michael Burr: Tôi không cài đặt pthread trên MingW một cách rõ ràng. Nhưng kể từ khi tôi thấy pthreadGC2.dll trong thư mục nhị phân MingW, tôi cho rằng nó hỗ trợ các cuộc gọi pthread. Không? – goldenmean

+0

Cảm ơn bạn đã liên kết đến pthread-Win32. Chỉ cần một truy vấn thì phần đầu pthread.h và pthreadgc2.dll trong MinGW là gì? – goldenmean

Trả lời

14

Bạn cần chỉ định thư viện trên dòng lệnh gcc/g ++ sau các tệp phụ thuộc vào thư viện. Vì vậy, hãy thử:

g++ -IC:/MinGW/include/ test.cpp -lpthread 

Tôi tự khắc phục khi trả lời câu hỏi (đây là câu hỏi thường gặp cho thư viện và gcc). Đối với hầu hết các thứ tự tùy chọn gcc không quan trọng, nhưng đối với các thư viện thì điều đó rất quan trọng.

Bạn không cần phải chỉ định đường dẫn thư viện nếu thư viện pthread đi kèm với bản phân phối MinGW của bạn (vì có vẻ như trường hợp này là dành cho bạn). Ngoài ra, hãy nhớ rằng dòng lệnh trên sẽ tạo ra một tệp thực thi a.exe; vượt qua -o test.exe để tránh điều đó.

+0

Ồ thật ngọt ngào. Sự thay đổi thứ tự của -lpthread đã làm việc. Cảm ơn bạn vì những gợi ý và câu trả lời hữu ích của bạn. Tôi yêu Stackoverflow! Diễn đàn đó là; không có trong mã của tôi! – goldenmean

+0

Cảm ơn bạn từ một người dùng khác gần một tháng sau đó! – The111

+0

Cảm ơn bạn từ một người dùng khác sau hai năm! –

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