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, который был в обработанной вами форме, которую вы использовали для компиляции. Единственное, что вам понадобится, это совместимое ядро на запущенной машине. Я знаю две программы для этого, один из них с открытым исходным кодом:
а другой - коммерческое программное обеспечение:
Конечно, этот подход имеет недостатки, например, если вы обновляете динамическую библиотеку, используемую вашим приложением для исправления ошибки, потому что в исполняемом файле эта библиотека встроена, вам придется снова скомпилировать приложение.