2008-09-20 56 views
8

Khi biên dịch một dll sử dụng __stdcall bên trong studio hình ảnh 2008, các tên hàm được biên dịch bên trong dll là.GCC biên dịch một dll với __stdcall

FunctionName

Mặc dù khi chúng tôi biên dịch dll tương tự sử dụng GCC sử dụng wx-dev-cpp GCC gắn thêm số lượng paramers hàm có, vì vậy tên của chức năng sử dụng Dependency Walker như thế nào.

FunctionName @ numberOfParameters hoặc == FunctionName @ 8

Làm thế nào để bạn nói với trình biên dịch GCC để loại bỏ @nn từ những biểu tượng xuất khẩu trong dll?

Trả lời

5

__stdcall trang trí tên hàm bằng cách thêm dấu gạch dưới vào đầu và số byte tham số vào cuối (cách nhau bằng @).

Vì vậy, một hàm:

void __stdcall Foo(int a, int b); 

... sẽ trở thành _Foo @ 8.

Nếu bạn liệt kê tên hàm (chưa được đặt trước) trong phần XUẤT KHẨU trong tệp .DEF của bạn, nó sẽ được xuất chưa được đặt trước.

Có lẽ đây là sự khác biệt?

+0

Cảm ơn roger vì đã trả lời, hóa ra vấn đề là một nhà phát triển khác đã đặt một tệp DEF vào dự án. Tệp DEF này đã nói với trình liên kết các quy ước đặt tên để sử dụng bên trong DLL. Đây là lý do tại sao chúng tôi đã nhận được một tên thư viện khác nhau ngay cả với cùng một quy ước gọi điện thoại. Giải pháp cho thấy một trong những nhà phát triển của chúng tôi đã xóa WINAPI khỏi tệp tiêu đề khi tạo DLL của riêng mình cho dự án. Điều này làm cho Windows visual studio trở lại với quy ước gọi __cdecl (/ Gd) mặc định của nó. – Chad

0

Bạn cũng có thể sử dụng -Wl,--add-stdcall-alias để lựa chọn mối liên kết của bạn trong GCC. Điều này sẽ đảm bảo rằng cả hai tên hàm (được trang trí và undecorated) đều có mặt và có thể được sử dụng như bí danh.

+0

Cảm ơn Matthias đã không biết điều này. – Chad

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