2010-02-27 36 views
5

Vì lý do nào đó, tôi nên sử dụng gcc để biên dịch một tệp C, sau đó liên kết với dự án Visual C++ 2008.Làm thế nào để biên dịch GCC mà không có _alloca?

(Tôi sử dụng phiên bản gcc mới nhất hiện nay: Cygwin gcc 4.3.4 20090804.)

Nhưng có một vấn đề: gcc luôn phân bổ một mảng lớn với _alloca,

và VC mối liên kết không thể giải quyết biểu tượng __alloca.

ví dụ,

int func() 
{ 
    int big[10240]; 
    .... 
} 

mã này làm cho sự phụ thuộc _alloca mặc dù tôi đã không gọi hàm _alloca một cách rõ ràng.

(vấn đề kích thước mảng nếu tôi thay đổi 10.240 -.> 128, mọi thứ ok)

tôi đã cố gắng lựa chọn gcc -fno-BUILTIN-alloca hoặc -fno-BUILTIN, nhưng không có may mắn.

Có thể làm cho gcc không sử dụng _alloca không? (hoặc điều chỉnh ngưỡng?)

+0

Tại sao không chỉ sử dụng 'malloc()' rõ ràng? –

+0

Đó không phải là nguồn viết của tôi và có phần phức tạp để chỉnh sửa. và có lẽ tác giả ban đầu không muốn hình phạt gọi malloc. – shkim

+1

Mục đích của alloca trong trường hợp này là để đảm bảo ngăn xếp đủ lớn để giữ mảng này. Trình biên dịch của Microsoft không cần alloca; nó phát ra mã thăm dò ngăn xếp này trực tiếp vào hàm. Đầu dò ngăn xếp không cần thiết khi người dân địa phương nhỏ. Điều gì sẽ xảy ra nếu bạn không sử dụng -fno-buildin-alloca và -fno-builtin? –

Trả lời

7

Điều tốt nhất cần làm là biên dịch tất cả mã bằng VC++. Nếu điều đó là không thể ..

Bạn nên sử dụng mingw gcc thay vì Cygwin. Nó được thiết kế để xuất mã sẽ được liên kết với thời gian chạy VC++, chứ không phải các thư viện Cygwin. Đặc biệt, nó sẽ gọi hàm VC++ runtime __chkstk thay vì __alloca.

+0

Tôi đã thử MinGW (gcc 3.4.5 mingw-vista special r3) và biên dịch một nguồn C đơn giản. nhưng kết quả dumpbin cho thấy __alloca phụ thuộc: dumpbin/ký hiệu test.obj ... 00C 00000000 UNDEF notype External | __alloca ... có tùy chọn đặc biệt cho mingw không? – shkim

+0

Ah, xin lỗi. Các mcc gcc làm điều này. Kết quả đầu ra xây dựng TDM GCC 4.x mingw __chkstk. http://www.tdragon.net/recentgcc/ – andrewffff

+0

Cảm ơn bạn. Tôi đã kiểm tra TDM gcc luôn luôn xuất ra __chkstk, nhưng VC2008 xuất ra _chkstk trên Release build, và _alloca_probe trên Debug build. Tôi nghĩ rằng tôi nên chỉnh sửa mã để sử dụng các biến địa phương dưới 4K. – shkim

3

Bạn chỉ có thể viết thói quen _alloca của riêng bạn và liên kết với điều đó. Nhìn vào nguồn thư viện gcc để xem nó phải làm gì.

+0

Khi tôi triển khai _alloca trong VS2008, tôi nhận được: lỗi C2169: '_alloca': chức năng nội tại, không thể được định nghĩa – shkim

+0

Tôi nghĩ bạn có thể muốn triển khai _alloca tùy chỉnh của mình bằng gcc thay vì Visual Studio. –

1

Có vẻ như _alloca đã bị Microsoft từ chối và không còn trong thư viện thời gian chạy của họ sau VS2005 nữa. Thư viện thời gian chạy mới hơn hỗ trợ _malloca.

Tùy chọn của bạn trông không ổn. Bạn có thể thử xây dựng với VS2005 để thay thế. Có lẽ Cygwin có một tùy chọn mà bạn có thể nói với nó rằng bạn đang sử dụng một thư viện thời gian chạy mới hơn (và nếu họ không hỗ trợ điều đó, bạn có thể gửi nó như là một yêu cầu tính năng).

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