2012-01-25 20 views
9

Sau khi nỗ lực đáng kể nhận được clang và libC++ để biên dịch, chạy, tích hợp với NetBeans, và thậm chí biên dịch chéo với máy 32 bit, tôi nghĩ tôi đã tìm ra tất cả! Vì vậy, tôi đi để sử dụng một số tính năng libstdC++ không có (toàn bộ lý do để biến môi trường dev của tôi lộn ngược), và khám phá ... Tôi không thể thực sự làm điều đó.libC++ - ngừng đổi tên std thành std :: __ 1?

libC++ được cài đặt, nó hoạt động và chương trình được biên dịch (khi nó hoạt động) yêu cầu nó. Tuy nhiên, trình biên dịch vẫn cố gắng sử dụng các phiên bản libstdC++ ở mọi cơ hội, bằng cách gây rối với không gian tên; std::__1::map, std::__1::basic_string, v.v. Bây giờ, tôi biết từ this question lý do tại sao điều đó xảy ra và tại sao libC++ thực hiện điều đó. Tôi chỉ cần biết làm thế nào để xóa bỏ nó, bởi vì nó hoàn toàn không thể áp dụng - tôi thực sự, thực sự muốn sử dụng các phiên bản libC++, và không có gì trong mã của tôi yêu cầu hai loại cùng tồn tại.

Tôi đã thử dùng thư mục libstdC++ ngoài đường dẫn bao gồm, và, thất bại, làm cho chúng hoàn toàn không thể tiếp cận. Không may mắn. Tôi không sử dụng bất kỳ thư viện bổ sung nào, chỉ có các tiêu đề được tích hợp sẵn trong Linux/POSIX (errno, socket, syslog, fcntl).

EDIT: Thông báo lỗi:

CoreCache.cpp:61:12: error: no member named 'emplace' in 'std::__1::map<std::__1::basic_string<char>, CacheEntry, std::__1::less<std::__1::basic_string<char> >, std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>, CacheEntry> > >' 

Các libstdC++ bản đồ không có đặt vào một chỗ(). Phiên bản libC++ hiện.

Các invocation sau, từ dòng lệnh, dường như làm việc:

clang++ -o stachecache -I /usr/local/lib/clang/3.1/include/ -I /usr/include/c++/v1/ -std=c++0x -stdlib=libc++ ./*.cpp 

Các gọi từ bên trong NetBeans không:

clang++ -stdlib=libc++ -O3 -c -O3 -Werror -MMD -MP -MF build/Release/clang-Linux-x86/CoreCache.o.d -o build/Release/clang-Linux-x86/CoreCache.o CoreCache.cpp 
+3

Thực ra, 'std :: __ 1 :: map' nằm trong' libC++ '* not * trong' libstdC++ '. Bạn có thể cho chúng tôi thấy thông báo lỗi không? –

+0

Tôi đã thêm lỗi vào bài đăng. Phiên bản libC++ của bản đồ có emplace(), nhưng phiên bản libstdC++ (cố gắng truy cập thông qua std :: __ 1 :: map) thì không. – DigitalMan

+0

Bạn có thể sử dụng dòng lệnh của mình không, chúng tôi có kiểm tra bạn vượt qua các tùy chọn chính xác không? (ví dụ, stdlib ví dụ: "clang ++ -stdlib = libC++") –

Trả lời

2

Từ nhận xét:

araqnid: Lệnh gọi NetBeans của bạn không có -std=c++0x, có cần thiết không? std::map::emplace là phương pháp C++ 11.

DigitalMan (OP): @araqnid Điều đó thực sự đã làm được! Clang phàn nàn về lập luận đó không được sử dụng - và trên thực tế, ngay cả khi nó được sử dụng và yêu cầu - vì vậy tôi đã lấy nó ra khỏi cấu hình NetBeans. Một cảnh báo lỗi là tốt hơn so với một lỗi hoàn toàn, chắc chắn.

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