2013-05-03 47 views
7

Tôi đang cố gắng sử dụng nội tại SSE4.2 với clang/llvm nhưng không biên dịch, vì tôi nhận được lỗi cannot select intrinsic từ LLVM. Mặt khác, cùng một mã biên dịch hoàn hảo trong gcc. Vì vậy, tôi nghĩ, có lẽ tôi có thể biên dịch hàm đó với gcc, để có một đối tượng hoặc tệp thư viện, và sau đó gọi hàm thư viện đó trong mã của tôi, được biên dịch bởi clang/llvm. Liệu điều đó có hiệu quả?Tôi có thể biên dịch một hàm với gcc và sau đó sử dụng nó với tiếng kêu không?

+3

Có thể. Nó sẽ phụ thuộc vào hệ thống của bạn. Mac? Linux? Các cửa sổ? Nói chung, bạn có thể trộn các tệp đối tượng được tạo bằng clang và gcc. Hãy chắc chắn rằng bạn sử dụng cùng một thư viện chuẩn (không trộn lẫn 'libC++' và 'libstdC++'). –

+5

Đối với đồng bằng C, nó được đảm bảo khá nhiều; tất cả các trình biên dịch có sử dụng _ABI_ chung (_Application Binary Interface_, tức là các cơ chế tương tự cho các hàm truyền/gọi thực thi, các tham số truyền và trả về, đặt ra các cấu trúc dữ liệu/các biến sắp xếp). Đối với C++, điều này không đúng (bạn không thể gọi mã Microsoft Visual C++ từ gcc/MinGW và ngược lại, ví dụ), nhưng trong trường hợp gcc/clang, bạn may mắn - chúng sử dụng cùng C và C++ ABI, và do đó mã nhị phân tương thích: http://stackoverflow.com/questions/11682748/is-clang-abi-same-as-g –

+1

@FrankH., Bạn CÓ THỂ gọi mã GCC từ MSVC (xem câu trả lời của tôi). Trong thực tế, bạn có thể gọi MSVC từ GCC (mặc dù tôi không biết tại sao bạn muốn kể từ khi GCC là tốt hơn lúc tối ưu hóa) nhưng điều này là khó khăn hơn vì MSVC không cung cấp một cách để tạo ra các quy ước gọi điện của Unix để bạn phải làm điều đó sau khi đối tượng được tạo ra và nó hạn chế hơn (ví dụ chỉ cho các hàm có bốn tham số). –

Trả lời

0

Đối với mọi mã C++ phức tạp hơn hoặc ít phức tạp hơn, ví dụ: mã biên dịch thành vtable - câu trả lời là số không lặp lại. Cả hai đều KHÔNG tương thích.

Để minh họa điểm trên, hãy cố gắng biên dịch thư viện Crypto++ với g ++ (tăng khoảng 40% tăng tốc cho AES/GCM) và sau đó liên kết mã được biên dịch ++ của bạn với nó.

+3

Sửa câu trả lời của riêng tôi: có bạn CÓ THỂ. Biên dịch mã của bạn bằng "clang ++ -stdlib = libstdC++". Sau đó, nó sẽ liên kết chính xác đến thư viện được biên dịch g ++ (bao gồm cả Crypto ++). Thật không may, ngược lại không hoạt động: mã g ++ - biên dịch sẽ không hoạt động với thư viện được biên dịch clang ++, bất kể cờ nào tôi đã thử. :-( – Mouse

0

Có thể nó có thể không hoạt động. Một số yếu tố của ABI có thể được mong đợi giống nhau. Ví dụ, tôi tin rằng cả g ++ và clang đều sử dụng tên lược đồ mang tên Itanium ABI. Những yếu tố khác thì không. Vì vậy, nó phụ thuộc vào cách phức tạp mã bạn đang biên dịch là.

Ngoài ra, tôi khuyên bạn nên mở một LLVM bug cho nội tại không thể chọn được. Clang và LLVM có một cộng đồng rất tích cực, và có thể ai đó sẽ chọn lỗi một cách nhanh chóng.

+1

Câu hỏi được gắn thẻ C, vì vậy toàn bộ ABI có thể được mong đợi giống nhau –

+0

Bạn nói đúng, tôi đã hiểu sai câu hỏi. – Marvin

4

Có thể biên dịch một tệp đối tượng bằng GCC trong Linux và chuyển đổi nó thành công việc trong Visual Studio. Tôi đã làm điều này gần đây chạy Linux trong Virtual Box trên Windows converting-c-object-file-from-linux-o-to-windows-obj vì vậy điều này nên có thể với Clang trên Linux hoặc Windows là tốt.

Vì vậy, không chỉ điều này có thể được thực hiện qua trình biên dịch nó có thể được thực hiện trên nền tảng.

Bạn cần nhận các quy ước gọi điện và định dạng tệp đối tượng chính xác (và đối với C++, tên mangling). Với GCC khi bạn biên dịch, bạn có thể cho biết nó gọi quy ước/API để sử dụng với mabi. Sau đó, nếu chuyển từ Linux sang Windows, bạn cần trình chuyển đổi tệp đối tượng để chuyển đổi từ ví dụ: ELF trên Linux để COFF trên Windows. Tất nhiên, có những trường hợp này có thể sẽ không hoạt động (ví dụ: nếu mô-đun dựa vào cuộc gọi hệ thống chỉ trong một nền tảng). Xem liên kết ở trên để biết thêm chi tiết.

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