G++ без libstdС++ - это можно сделать? - очень настраиваемый легкий libstdС++, в котором я могу легко извлечь материал, также будет делать трюк

Я пытаюсь здесь что-то запугать. Я пытаюсь написать программы на С++, скомпилированные с GNU g++, но без зависимости от libstdС++:), но кажется, что мне нужно, чтобы даже самые элементарные вещи нуждались в нем.

Доступен libstdС++ с настраиваемым набором функций.

Используемая мной команда

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

Без libstdС++ я получаю:

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'

Это не в libc, так есть ли действительно легкий libstdС++, который реализует именно эти вещи?

Мой тестовый код, который я хочу построить таким образом, в настоящее время выглядит следующим образом:

#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;
}

Ответ 1

Да, такие вещи, как operator new и operator delete, действительно определены в С++, а не в C, поэтому было бы абсурдно иметь их в библиотеке времени выполнения для C, а не для С++ (то же самое для "чистый виртуальный", используемый для четкой диагностики неправомерных вызовов чистым виртуальным методам и т.д.). Если вы связываете весь исполняемый файл без доступа к динамической библиотеке, компоновщик должен (один надеется - в зависимости от того, как модульная библиотека времени выполнения С++ кодируется) выберите и выберите минимальную часть стандартной библиотеки С++, которую вы используете в своем коде (и чем меньше специальных функций на С++, например new подразумевает delete для вызовов деструктора и т.д. - тем больше у вас шансов избежать наложения больших блоков библиотеки, конечно; -).

Ответ 2

Попробуйте установить ссылку libsupc++.a. Это голая библиотека портов С++ sup, без тяжелых функций iostreams или чего-то еще.

Я не уверен, но я считаю, что использование этого вместо libstdc++.a получило бы "автономную" реализацию С++, в отличие от "размещенной" или полной реализации, как определено в разделе 1 стандарта.

Ответ 3

Вот хорошее объяснение:

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

В статье объясняется более подробно, но одна из основных причин для этого это библиотеки С++, которые, как правило, менее стабильны, чем базовые файлы libc. Это может помочь уменьшить проблемы с зависимостями.

Ответ 4

Другим подходом может быть "статизация" вашей программы. Это означает встроить все библиотеки в статический исполняемый файл, и таким образом ваш код всегда будет использовать glibc, который был в обработанной вами форме, которую вы использовали для компиляции. Единственное, что вам понадобится, это совместимое ядро ​​на запущенной машине. Я знаю две программы для этого, один из них с открытым исходным кодом:

а другой - коммерческое программное обеспечение:

Конечно, этот подход имеет недостатки, например, если вы обновляете динамическую библиотеку, используемую вашим приложением для исправления ошибки, потому что в исполняемом файле эта библиотека встроена, вам придется снова скомпилировать приложение.