2009-11-09 6 views
7

Tôi đang cố gắng xây dựng một dự án tôi có và nó có một số chức năng được xuất. Các chức năng theo các quy ước stdcall và họ nhận được đọc sai nếu biên soạn với GCC nhưCó bất kỳ điều gì thay đổi lược đồ mang tên xuất khẩu trong GCC không?

[email protected] 

trình biên dịch khác mangle tên như thế này:

[email protected] 

là bất kỳ cách nào tôi có thể buộc GCC để mangle tên của các các hàm được xuất sang ví dụ sau?

Trả lời

0

Xem sách hướng dẫn GCC về -fleading-underscore. Do đọc các cảnh báo về hậu quả của hành động này tuy nhiên; nó có thể không phải là giải pháp bạn nghĩ.

+0

Cảm ơn câu trả lời mặc dù nó dường như không hoạt động, vì vậy tiêu chuẩn trong C không phải là sử dụng dấu gạch dưới hàng đầu? Tôi đã cố gắng để làm cho nó loại di động giữa các trình biên dịch, các chức năng được xuất khẩu của một DLL mà cần phải được nạp. –

+0

Bạn có biên dịch mã dưới dạng C hoặc C++ không? Đối với khả năng tương tác của trình biên dịch, DLL chỉ phải trình bày các giao diện C. Bạn có thể sử dụng C++, nhưng giao diện nên được khai báo bên ngoài "C" (và tất nhiên chỉ sử dụng các kiểu tương thích C và không có quá tải hàm). – Clifford

0

Đặt cược tốt nhất khi giao dịch với mang tên hàm trên Windows là luôn sử dụng tệp .def. Điều này sẽ làm việc giống nhau bất kể trình biên dịch. Thông thường, bạn chỉ cần phần EXPORTS:

EXPORTS 
    Func1 
    Func2 
    ... 
4

Xem this answer.

int Func() __asm__("[email protected]"); 

Điều này sẽ buộc GCC đặt tên cho biểu tượng [email protected] bất kể nó sẽ làm gì bình thường.


Oh phải, @ là đặc biệt: nó được sử dụng để tạo biểu tượng. Tôi nghĩ rằng __asm__("[email protected]") được sử dụng để làm việc, nhưng tôi đoán nó không còn nữa.

int Func() __asm__("_Func"); 
__asm__(".symver _Func, [email protected]"); 

này phải được kèm theo một file version script, như:

1 { 
    global: 
    _Func; 
}; 

trao cho gcc -Wl,--version-script=foo.version khi liên kết.

+0

Cảm ơn, nhưng tôi đang làm điều gì đó sai hoặc nó không hoạt động, nó sẽ không cho phép tôi liên kết nó. http://pastebin.com/f14a9a00f –