2012-03-14 9 views
5

Tôi đang sử dụng MinGW. Tôi có một số mã mà gọi malloc và một vài chức năng mục đích chung khác. Khi tôi nhập:MinGW không xác định tham chiếu đến malloc, miễn phí, sprintf, _beginthreadex

gcc TestCode.c 

Tôi nhận được tệp a.exe, nó hoạt động hoàn hảo và tôi không nhận được bất kỳ cảnh báo nào.

Nếu tôi gõ này:

gcc -c TestCode.c -o TestCode.o 
ld *.o 

tôi nhận được một bó toàn bộ các cảnh báo như:

TestCode.o:TestCode.c:(.text+0xa): undefined reference to `__main' 
TestCode.o:TestCode:(.text+0x2e): undefined reference to `printf' 
TestCode.o:TestCode:(.text+0x42): undefined reference to `_strerror' 
TestCode.o:TestCode:(.text+0x69): undefined reference to `snprintf' 
TestCode.o:TestCode:(.text+0x7e): undefined reference to `malloc' 
TestCode.o:TestCode:(.text+0x93): undefined reference to `_strerror' 
TestCode.o:TestCode:(.text+0xb1): undefined reference to `sprintf' 
TestCode.o:TestCode:(.text+0xcf): undefined reference to `free' 

Tôi giả định này là một vấn đề với cách tôi đang kêu gọi các mối liên kết. Như vậy, tôi sẽ chỉ đăng mã nếu nó không rõ vấn đề là gì. Tôi hy vọng đây là một sửa chữa dễ dàng và tôi chỉ đơn giản là quên bao gồm một số thư viện siêu rõ ràng khi liên kết.

+1

có thể trùng lặp với [Lỗi liên kết trong khi sử dụng trình biên dịch MinGW (không thể tìm thấy __main)] (http://stackoverflow.com/questions/4981826/link-error-while-using-mingw-compiler-cant-find- chính) –

Trả lời

7

Dường như ld của bạn không liên kết bất kỳ thư viện nào theo mặc định. Từ các thông báo lỗi của bạn, có vẻ như bạn cần ít nhất thời gian chạy C và libc. Sử dụng gcc liên kết để có được một số giá trị mặc định có ích liên quan trong cho bạn:

gcc -c TestCode.c -o TestCode.o 
gcc *.o 

Nếu bạn thực sự muốn sử dụng ld trực tiếp, bạn sẽ cần phải tìm ra tên của thư viện runtime C và libc . Ví dụ (giả sử thư viện mang tên libcrtlibc):

ld *.o -lcrt -lc 
+1

Cảm ơn bạn đã chỉ đường! Tôi đã có thể làm cho nó hoạt động bằng cách bao gồm cờ -lmsvcrt trên ld của tôi. Thật không may, việc xây dựng dự án có thể là quá lớn đối với chúng tôi để di chuyển ra khỏi sử dụng ld trực tiếp, nhưng cảm ơn cho lời khuyên! – Brett

+0

Sử dụng gcc làm giao diện người dùng cho trình liên kết không nên tạo bất kỳ sự khác biệt nào. Ý bạn là "quá lớn để bạn tránh xa việc sử dụng' ld' "? –

1

Như Carl Norum said, bạn có thể vượt qua các file đối tượng để gcc và nó sẽ biết nó không cần phải biên dịch chúng - nó chỉ cần vượt qua chúng trên để mối liên kết (cho dù bạn có đang biên dịch các tệp nguồn khác trong cùng một lời gọi) hay không. Và bạn có lẽ nên làm điều đó vì có một lượng chi tiết hợp lý đi vào liên kết trong CRT và các thư viện hỗ trợ cửa sổ (trừ khi bạn có nhu cầu rất cụ thể để không sử dụng thời gian chạy mặc định). hiện MinGW thiết lập liên kết của tôi trong các mục sau đây cùng với các tập tin đối tượng của tôi:

crt2.o 
crtbegin.o 

-ladvapi32 
-lshell32 
-luser32 
-lkernel32 
-lmingw32 
-lgcc 
-lmoldname 
-lmingwex 
-lmsvcrt 

crtend.o 

Sử dụng tùy chọn --verbose để xem cách gcc liên kết cho bạn.