2010-09-15 27 views
10

Tôi đang thử một thứ gì đó ma quái ở đây. Tôi đang cố gắng viết các chương trình C++, được biên dịch bằng g ++ của GNU, nhưng không có sự phụ thuộc vào libstdC++ :) nhưng có vẻ như tôi cần điều đó ngay cả những thứ cơ bản nhất cần nó.g ++ mà không cần libstdC++ - có thể thực hiện được không? - một libstdC++ có thể cấu hình rất nhẹ, nơi tôi có thể lấy ra một cách dễ dàng cũng sẽ thực hiện thủ thuật

Một libstdC++ với bộ tính năng có thể định cấu hình sẽ được chấp nhận.

Lệnh tôi sử dụng là

g++ -nodefaultlibs -fno-rtti -fno-exceptions -lc 

Without libstdC++, tôi nhận được:

undefined reference to `operator delete(void*)' 
undefined reference to `operator new(unsigned int)' 
undefined reference to `vtable for __cxxabiv1::__class_type_info' 
undefined reference to `vtable for __cxxabiv1::__si_class_type_info' 
undefined reference to `__cxa_pure_virtual' 

Đây không phải là trong libc, như vậy là có một libstdc thực sự ánh sáng ++ mà thực hiện chỉ những điều này?

mã kiểm tra của tôi mà tôi muốn xây dựng theo cách này hiện trông như thế này:

#include <stdio.h> 

template <class T> 
class X 
{ 
    public: 
    T a; 
}; 

class A1 
{ 
    public: 
     virtual void f() = 0; 
     virtual ~A1() {} 
}; 

class A2 : public A1 
{ 
    public: 
     virtual void f() {}; 
     virtual ~A2() {} 
}; 

class Y 
{ 
    public: 
     ~Y() {} 
}; 

int main() 
{ 
    X<int> A; 
    X<float> B; 
    Y *C = new Y; 

    A.a = 12; 
    B.a = 2.3; 

    printf("A: %d; B: %f\n", A.a, B.a); 

    A2 *a2 = new A2; 
    a2->f(); 

    return 0; 
} 
+0

Nếu bạn có thể giới hạn mình thành malloc/miễn phí, bạn có thể cắt giảm ngay cả những phụ thuộc đó. Điều đó nói rằng, không chắc chắn những gì mục tiêu của bạn ở đây là ở nơi đầu tiên. –

+0

biên dịch nhị phân tĩnh? – Anycorn

+3

Nó không rõ ràng với tôi tại sao libc là ok nhưng không libstdC++, nếu đó thực sự là trường hợp, chỉ cần viết trong C, bạn sẽ có ít đau đầu hơn cố gắng sử dụng một tập hợp con tê liệt tùy ý của C + +. –

Trả lời

1

Dưới đây là một lời giải thích tốt:

http://www.trilithium.com/johan/2005/06/static-libstdc/

Bài báo giải thích một cách chi tiết hơn, nhưng một lý do quan trọng để làm điều này là các thư viện cụ thể C++ có xu hướng ít ổn định hơn so với các công cụ libc cơ bản. Điều này có thể giúp giảm các vấn đề phụ thuộc.

+0

Nó không phải là sự ổn định ABI tôi lo lắng, vì trong trường hợp này tôi biên dịch toàn bộ Linux distro (phần mềm nhúng). Tôi chỉ cần dọn dẹp một số không gian. Nếu tôi không thể, sau đó c'est la vie :) Tôi sẽ phải đi một cách khó khăn và thực sự sửa chữa mã: D –

+0

Nếu bạn đang rất hạn chế không gian đi trần C có thể là một lựa chọn tốt. (bạn có thể dễ dàng 'giả' OOP). – seand

+0

Nếu tôi có thể viết lại ứng dụng mà tôi muốn thực hiện, tôi sẽ không hỏi câu hỏi này.Tôi đang mở một libstdC++ có thể cấu hình rất tốt nơi tôi có thể lấy ra mọi thứ tôi không cần bằng cách sử dụng 'make menuconfig' hoặc tương tự. –

5

Vâng, những thứ như operator newoperator delete đang thực sự được định nghĩa trong C++, không trong C, vì vậy nó sẽ là vô lý để có chúng trong thư viện thời gian chạy cho C như trái ngược với một cho C++ (tương tự cho các "tinh khiết ảo "được sử dụng để chẩn đoán rõ ràng các cuộc gọi sai đến các phương thức ảo thuần túy, v.v.). Nếu bạn liên kết toàn bộ tệp thực thi của bạn mà không cần truy cập thư viện động, trình liên kết nên (một hy vọng - tùy thuộc vào cách thư viện thời gian chạy C++ được mô đun hóa) chọn và chọn phần tối thiểu trống của thư viện C++ chuẩn mà bạn sử dụng trong mã của mình (và C++ ít tính năng cụ thể bạn sử dụng - chẳng hạn như new ngụ ý delete cho các cuộc gọi hủy, vv - cơ hội của bạn càng tránh để kéo khối lớn hơn của thư viện, tất nhiên ;-).

+0

Tôi tò mò tại sao bạn nói nó sai trái những gì tôi đã làm với ảo thuần túy ở đó. Tôi chỉ muốn một ảo tinh khiết để kích hoạt một lỗi linker, nhưng kể từ khi bạn nói nó sai, tôi tự hỏi tại sao, chỉ trong trường hợp tôi có một vấn đề hiểu biết sâu hơn về ảo tinh khiết. Cảm ơn. –

+0

Nó có ý nghĩa rằng những người không có trong libc, nhưng tôi đang tìm một libstdC++ mà tôi thích hợp với nhu cầu của tôi. I E. đưa ra tất cả mọi thứ nhưng tối thiểu. uClibC++ nháy mắt với tôi. –

+0

@Radu, không có gì sai khi có ảo thuần túy (nhưng không có lý do gì nên lỗi lúc _link_ thời gian!), Nhưng nó _will_ yêu cầu hỗ trợ C++ - cụ thể (giống như 'mới' sẽ). –

2

Thử liên kết với libsupc++.a. Đó là thư viện cổng C++ sup trần, không có chức năng iostreams nặng hoặc bất cứ thứ gì.

Tôi không chắc chắn, nhưng tôi tin rằng việc sử dụng thay vì libstdc++.a sẽ có được triển khai C++ "độc lập", trái ngược với "được lưu trữ" hoặc triển khai hoàn chỉnh, như được định nghĩa tại khoản 1 của tiêu chuẩn.

+0

Chỉ cần thử liên kết với libsupC++ và không thay đổi gì cả. –

+0

Nếu bạn đã xem mã trong libsupC++ (không hỏi tại sao), bạn sẽ thấy nó hỗ trợ libstdC++ nhiều hơn là một tập con của thời gian chạy C++. Nó giống như một thời gian chạy C++ runtime nếu bạn muốn, và tôi không nghĩ rằng nó sẽ giúp bạn đi xa. –

+0

@Radu: Thật sao? Sử dụng GCC 4.2.1 'g ++ -nostdlib -lsupC++ -lc -lcrt1.o barenew.cpp' biên dịch mã của bạn tốt. Bỏ qua '-lsupC++' Tôi nhận được một vài lỗi phù hợp với bạn. – Potatoswatter

0

Một cách tiếp cận khác có thể là "statifie" chương trình của bạn. Nó có nghĩa là để nhúng tất cả các thư viện trong một tập tin thực thi tĩnh và theo cách đó mã của bạn sẽ luôn sử dụng glibc trong gia công mà bạn đã sử dụng để biên dịch. Điều duy nhất bạn cần là một hạt nhân tương thích trong máy đang chạy.Tôi biết hai chương trình để làm điều đó, một là mã nguồn mở:

và một trong những khác là phần mềm thương mại:

Tất nhiên điều này phương pháp tiếp cận có nhược điểm như ví dụ nếu bạn cập nhật một thư viện động mà ứng dụng của bạn đang sử dụng để sửa một lỗi, bởi vì trong thực thi thư viện được nhúng, bạn sẽ phải biên dịch lại ứng dụng của bạn.

+0

quên nó đi, Nếu bạn bị hạn chế về mặt không gian, điều này sẽ không khắc phục được vấn đề của bạn. –

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