g++ 没有 libstdc++ - 可以做到吗? - 一个非常可配置的轻量级 libstdc++,我可以轻松地取出东西也可以做到这一点

2024-01-08

我在这里尝试一些令人毛骨悚然的事情。我正在尝试编写 C++ 程序,用 GNU 的 g++ 编译,但不依赖 libstdc++ :) 但似乎我需要它,即使是最基本的东西也需要它。

具有可配置功能集的 libstdc++ 是可以接受的。

我使用的命令是

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

没有 libstdc++,我得到:

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 中,那么是否有一个真正轻量级的 libstdc++ 可以实现这些东西?

我想以这种方式构建的测试代码目前如下所示:

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

也许这个答案有点太晚了,但是......

不用 libstdc++ 编写 C++ 程序很容易。我已经这样做了几十年了。 只是避免与 libstdc++ 链接。这很简单:要么使用 gcc 而不是 g++ 进行链接,要么提供一个仅包含 new、del 和其他一些函数的假 libstdc++。

以下是如何使用 malloc 的透明包装器替换基本 libstdc++ 功能的示例:

#include <stdlib.h>

// MSVC uses __cdecl calling convention for new/delete :-O
#ifdef _MSC_VER
#  define NEWDEL_CALL __cdecl
#else
#  define NEWDEL_CALL
#endif

extern "C" void __cxa_pure_virtual ()
{
    abort ();
}

void * NEWDEL_CALL operator new (size_t size)
{
    return malloc (size);
}

void * NEWDEL_CALL operator new [] (size_t size)
{
    return malloc (size);
}

void NEWDEL_CALL operator delete (void *p)
{
    if (p) free (p);
}

void NEWDEL_CALL operator delete [] (void *p)
{
    if (p) free (p);
}

void NEWDEL_CALL operator delete (void *p, size_t)
{
    if (p) free (p);
}

现在将其放入名为 libstd--.cpp 的文件中,并构建您自己的 libstdc++.a:

gcc -c -O libstdc--.cpp
ar crs libstdc++.a libstdc--.o

然后你可以尝试一个简单的测试:

class A
{
    int *x;

public:
    A () { x = new int [10]; }
    ~A () { delete [] x; }
};

int main ()
{
    A a;
    return 0;
}

编译并查看链接的内容:

g++ -g test.cpp -o test -L。

# ldd ./test
    linux-vdso.so.1 (0x00007ffed0b8d000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f4d18df0000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f4d18bd9000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f4d18823000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f4d1913b000)

嘿,看,妈妈,没有 libstdc++!

作为替代方案,您可以通过使用 gcc 而不是 g++ 链接并在链接器命令行上提供 libstdc--.o 来避免使用假 libstdc++,以便您的代码可以找到替换消息并删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

g++ 没有 libstdc++ - 可以做到吗? - 一个非常可配置的轻量级 libstdc++,我可以轻松地取出东西也可以做到这一点 的相关文章

随机推荐

  • 使用 Swift 创建随机图像生成器

    我试图让随机图像出现在屏幕上 但我是 Swift 新手 不知道如何做到这一点 打开应用程序时 我希望在图像视图中随机显示三张图像 我该怎么做呢 生成 0 到 2 之间的随机数 并通过随机生成的数字显示图像 var random arc4ra
  • ASP.NET 会话 - 使用或不使用电子商务应用程序以及最佳实践

    我在大多数 Intranet 场景中使用过 ASP NET 并且非常熟悉它 但对于诸如购物车或类似会话数据之类的东西 有多种可能性 仅举几例 1 状态服务器会话 2 SQL Server 会话 3 自定义数据库会话 4 饼干 您使用了什么以
  • SymPy 虚数

    我正在编写一些 SymPy 代码来处理带有虚数的符号表达式 首先 我想让它把 x 和 y 作为实数并找到 x iy 的解 所以我可以按如下方式执行此操作 x y sympy symbols x y real True print sympy
  • 如何将连接字符串中的“提供商名称”添加到上下文文件中?

    我正在使用 Entity Framework 5 代码优先方法 这是我的上下文文件 using IMS Domain Inventory using IMS Domain Security using IMS Domain StoredPr
  • 如何重定向“time”命令的输出?

    我尝试重定向 time 命令的输出 但我不能 time ls gt filename real 0m0 000s user 0m0 000s sys 0m0 000s 在文件中我可以看到输出ls命令 而不是time 请解释一下为什么我不能以
  • 如何更改 TabHost 中的选项卡图像

    我在应用程序中使用 TabHost 在应用程序中使用四个选项卡 并且当选择特定选项卡和未选择特定选项卡时 我想在 TabHost 中使用不同的图像 我需要为每个特定选项卡使用不同的图像 当我选择任何选项卡时 图像有点亮 当我切换到另一个选项
  • 为不同平台创建独立的 Java 可执行文件,无需安装

    我使用 jlink 创建了一个 Java 应用程序运行时映像 我希望能够将软件作为可执行文件发送到不同的平台 最好是在一个平台上构建 例如交叉编译 理想情况下 它是一个用户可以双击启动的应用程序文件 而无需安装任何东西 如何才能做到这一点
  • 如何在 SQL Server 中比较两列是否相等?

    我有两列根据某些条件连接在一起 但我还想检查其他两列是否相同 然后返回一个位字段 如果相同 有没有比使用 CASE WHEN 更简单的解决方案 理想情况下我可以使用 SELECT Column1 Column2 AS MyDesiredRe
  • 制作一门语言,需要一个好的后端

    我想做一种编译语言 我目前正在评估后端 到目前为止 我之所以关注 C 是因为它的执行速度 编译速度以及一个名为 TCC 的小型且易于使用的编译器 阅读了这里关于将其用作中间语言的讨论后 我正在尝试思考如何使其与垃圾收集兼容并处理异常 到目前
  • 元素必须是 根元素的直接子元素

    我正在尝试运行我的 Android 应用程序 但出现以下错误 该元素必须是根元素的直接子元素 并且元素类型 应用程序 必须由匹配的结束标记 终止 有人能给我写一个 正确 的版本吗 谢谢 这是我的清单文件
  • 无法连接到 SQL 数据库 - C#、VS2012、SQL Server 2012

    我的 Windows 7 64 位 PC 上安装了 SQL Server 2005 2008 和 2012 这是我的配置管理器 我确实看到代理已停止 不确定是否需要这样做 我把它分成两幅图像 这样尺寸就显示得更大 以下是 VS2012 数据
  • 如何以编程方式创建android形状背景?

    如何以编程方式创建这个形状
  • 修剪 Xcode 中的尾随空格

    有没有办法在我保存文件时强制 Xcode 修剪尾随空格 如果重要的话 我正在使用版本 3 1 3 从 Xcode 4 4 开始 默认情况下将自动修剪空格 除非该行全是空格 您还可以激活Including whitespace only li
  • 如何重定向到 Grails 应用程序中上次访问的页面?

    我是 Grails 的新手 我正在努力解决许多简单的问题 例如 当我从页面顶部布局上显示的模板视图登录 注销时 我尚未找到返回上次访问页面的正确方法 我解决此问题的最后一次尝试是将 params controller 和 params ac
  • 更新捆绑的资源文件

    我正在做以下事情 String str this is the new string URL resourceUrl getClass getResource path to resource File file new File reso
  • 使用maven编译时如何忽略.java文件?

    我的源目录中有 java 文件 由于某些 API 更改 这些文件尚未编译 我想一一修复源 忽略其中一些源来运行测试会很有用 使用 Maven 编译器插件和排除选项
  • 将 JSON 文件从类库 nuget 包复制到 bin

    我为这个模糊的标题表示歉意 但我不知道如何表达它 我正在使用 自定义 appsettings json 文件夹 json 文件位于使用它的类库中 我想创建一个 nuget 包来安装此类库 但还要确保将 appsettings json 复制
  • 构建网络服务器,客户端不确认 HTTP 200 OK 帧

    我正在根据教程构建自己的网络服务器 我找到了一种简单的方法来启动 TCP 连接并发送一段 http 数据 网络服务器将在微控制器上运行 因此它会非常小 无论如何 以下是我需要经历的顺序 接收SYN 发送SYN ACK 接收 ACK 连接现已
  • 使用 ZipFile 从 Python 中的 zip 文件中提取 .app

    我正在尝试从他们的快照中提取 Chromium app 的新版本 并且我可以很好地下载该文件 但是在提取它时 ZipFile 要么将其中的 chrome mac 文件夹提取为文件 说目录不 我对 python 很陌生 所以这些错误对我来说没
  • g++ 没有 libstdc++ - 可以做到吗? - 一个非常可配置的轻量级 libstdc++,我可以轻松地取出东西也可以做到这一点

    我在这里尝试一些令人毛骨悚然的事情 我正在尝试编写 C 程序 用 GNU 的 g 编译 但不依赖 libstdc 但似乎我需要它 即使是最基本的东西也需要它 具有可配置功能集的 libstdc 是可以接受的 我使用的命令是 g nodefa