2009-10-17 18 views
5

Đây là một phần của chuỗi ít nhất hai câu hỏi liên quan chặt chẽ, nhưng khác biệt. Tôi hy vọng tôi đang làm điều đúng bằng cách yêu cầu họ một cách riêng biệt.Xây dựng ứng dụng Visual C++ không sử dụng chức năng CRT vẫn tham chiếu một số

Tôi đang cố gắng để ứng dụng Visual C++ 2008 hoạt động mà không có Thư viện thời gian chạy C. Đó là một ứng dụng Win32 GUI mà không cần MFC hoặc các công cụ ưa thích khác, chỉ cần Windows API đơn giản.

Vì vậy, tôi đặt Thuộc tính dự án -> Cấu hình -> C/C++ -> Nâng cao -> Bỏ qua tên thư viện mặc định thành Có (cờ biên dịch /Zl) và được xây dựng lại. Giả sử tôi đã viết một hàm điểm nhập phù hợp, là chủ đề của my other question.

Tôi nhận được hai lỗi trình liên kết; chúng có thể liên quan. Trình liên kết phàn nàn về các biểu tượng bên ngoài chưa được giải quyết __fltused_memcpy trong foobar.obj. Không cần phải nói, tôi sử dụng không rõ ràng trong chương trình của tôi, nhưng tôi sử dụng memcpy ở đâu đó trong foobar.cpp. (Tôi đã sử dụng CopyMemory nhưng điều đó hóa ra là #define d để được giống hệt nhau để memcpy ...)

(Tôi nghĩ tôi có thể thoát khỏi những vấn đề memcpy bằng cách sử dụng một trình biên dịch nội tại, như #pragma intrinsic(memcpy), nhưng điều này làm cho không có sự khác biệt.)

Nếu tôi nhìn vào sản lượng tiền xử lý (thêm /P vào dòng lệnh biên dịch), tôi thấy không có tham chiếu đến một trong hai __fltused hoặc _memcpy trong foobar.i.

Vì vậy, câu hỏi của tôi là: Các lỗi liên kết này đến từ đâu và làm cách nào để giải quyết chúng?

+0

Và câu hỏi của bạn là? –

+0

Ah ... chắc chắn đã mất đi bằng cách nào đó trong khi chia nhỏ thứ này thành hai. Thêm lại nó, cảm ơn! – Thomas

Trả lời

8

__fltused ngụ ý bạn đang sử dụng hoặc có ít nhất tuyên bố một số phao hoặc đôi. Trình biên dịch tiêm biểu tượng 'vô ích' này để gây ra một hỗ trợ nổi .obj để được tải từ crt. Bạn có thể khắc phục điều này bằng cách chỉ đơn giản tuyên bố một biểu tượng với tên

#ifdef __cplusplus 
extern "C" { 
#endif 
int __fltused=0; 
#ifdef __cplusplus 
} 
#endif 

WRT _memcpy - memcpy là một chức năng __cdecl, và tất cả các chức năng cdecl nhận được một tự động _ như một phần trang trí của họ. vì vậy, khi bạn nói "__cdecl memcpy" - trình biên dịch & trình liên kết tìm kiếm một biểu tượng có tên '_memcpy'. Các hàm nội tại - thậm chí được yêu cầu một cách rõ ràng - vẫn có thể được nhập khẩu nếu các thiết lập xây dựng có các thiết lập gỡ lỗi chống lại nội tại. Vì vậy, bạn sẽ cần phải thực hiện memcpy của riêng bạn và các chức năng liên quan tại một số điểm anyway.

+0

Cảm ơn bạn đã trả lời nhanh! Thật không may, các trick '__fltused' dường như không làm gì cho tôi. Tôi đặt 'int __fltused = 0;' ở trên cùng của 'foobar.cpp'; tĩnh hoặc không tĩnh cũng không tạo ra sự khác biệt. – Thomas

+0

Ngoài ra, tôi khá chắc chắn tôi không sử dụng bất kỳ phao nổi hoặc đôi ở bất cứ đâu. Cây nguồn của tôi không chứa những từ này. – Thomas

+0

Ah, gói nó trong 'extern" C "' đã làm các trick. Cảm ơn! – Thomas

0

Tôi khuyên bạn nên đặt tùy chọn "tạo danh sách lắp ráp" (hoặc một số tùy chọn) cho foobar.cpp một lần và sau đó kiểm tra mã trình lắp ráp. Điều này thực sự sẽ cho bạn biết nơi các biểu tượng này được sử dụng.

+0

Tôi không chính xác là một guru lắp ráp x86. Nhưng nếu tôi có thể nhận được các công cụ đã tìm ra, tôi có thể thử cái này vào ngày mai. – Thomas

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