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?
Trả lời
Đố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ó.
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
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.
Câu hỏi được gắn thẻ C, vì vậy toàn bộ ABI có thể được mong đợi giống nhau –
Bạn nói đúng, tôi đã hiểu sai câu hỏi. – Marvin
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.
- 1. Không thể biên dịch C++ với gcc
- 2. Tôi có thể sử dụng macro được xác định trước nào để phát hiện tiếng kêu?
- 3. Làm thế nào tôi có thể biên dịch mã CUDA sau đó liên kết nó với một dự án C++?
- 4. Tôi có thể liên kết với một hàm có đối số mặc định và sau đó gọi nó không?
- 5. GCC biên dịch một dll với __stdcall
- 6. Có thể biên dịch hạt nhân Linux bằng một cái gì đó khác với gcc
- 7. Tôi có thể liên kết một phương thức hiện có với một hàm LLVM * và sử dụng nó từ mã được biên dịch JIT không?
- 8. Tôi có thể biên dịch mã phổ dụng bằng cách sử dụng GCC của Macports không?
- 9. Có thể biên dịch phiên bản LLVM mới hơn và sử dụng nó với Xcode không?
- 10. Loại thời gian biên dịch không có RTTI với GCC
- 11. Sau khi cài đặt Xcode, đâu là tiếng kêu?
- 12. Simple Hello World trong Objective-C với kêu vang và gnustep không biên dịch
- 13. Tại sao không thể tìm thấy getaddrinfo khi biên dịch với gcc và std = c99
- 14. Có thể dịch một ngôn ngữ lắp ráp sang LLVM IR, tối ưu hóa nó và sau đó biên dịch lại nó sang một kiến trúc khác không?
- 15. Tôi có thể sử dụng hàm __builtin_expect() của GCC với toán tử bậc ba trong C
- 16. Làm cách nào tôi có thể biên dịch thành lắp ráp với gcc
- 17. Tôi có thể sử dụng JAVAC để biên dịch một dự án với nhiều tệp và thư mục không?
- 18. Tôi có thể sử dụng boost :: make_shared với một hàm tạo riêng không?
- 19. Có thể sử dụng currying với các hàm lambda không?
- 20. gmon.out không được viết sau khi biên dịch với gcc -pg -g
- 21. Có thể nhận GCC để biên dịch UTF-8 với các tệp nguồn BOM không?
- 22. Tạo tham số cho một hàm với kêu vang
- 23. Làm thế nào tôi có thể nói tiền thưởng để tạo ra một Makefile có sử dụng tiếng kêu?
- 24. GCC tuyên bố một hàm bạn để bị quá tải, gọi mơ hồ, kêu vang biên dịch
- 25. Biên dịch mã sử dụng hàm bind() với libcxx không thành công
- 26. Tại sao ứng dụng của tôi sử dụng nhiều bộ nhớ hơn sau khi tôi nén nó với UPX và tôi có thể làm gì với nó?
- 27. Có thể sử dụng tăng tốc GPU khi biên dịch nhiều chương trình trên trình biên dịch gcc không?
- 28. Viết một giao diện bằng tiếng kêu
- 29. gcc: cách không biên dịch với cảnh báo
- 30. Biên dịch Gcc "không thể tính hậu tố của tệp đối tượng: không thể biên dịch"
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++'). –
Đố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 –
@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ố). –