----------------------------------------------1-------- ----------------------------------
我正在为运行嵌入式 Linux 的 ARM 编译程序。我本来是把程序写成c++程序的,所以代码中有一些operator new
和operator delete
s。现在,要为典型的 PC 平台编译带有operator new
s 和operator delete
s 的东西,我需要为链接器指定一个特定的参数 (-lstdc++)。我不知道这到底是做什么的。
现在,如果我尝试将此链接器选项与我的 ARM 交叉编译器一起使用,我会正确链接,但在运行时会失败并显示以下消息:
ld.so 检测到不一致:dl-deps.c:622:_dl_map_object_deps:断言“nlist > 1”失败!
如果我省略链接选项,我运行良好。这看起来像是一个断言失败,但这是我愿意冒险猜测的。任何人都可以阐明这个错误或其可能的原因吗?
-----------------------------------------------------------2-- ----------------------------------
我决定省略 (-lstdc++) 选项,并将我的所有类指针替换为指向堆栈上变量实例的指针。这行得通,但它显然是草率的,因为这应该是学生的一个例子,我希望它干净。一个干净的方法是创建我自己的operator new
and operator delete
...但我将如何实际使用自定义运算符并不明显。
举个例子,someClass * foo = new someClass(arg);
这是三个(?)步骤。
- 调用运算符 new。为新的类实例分配一些内存。
- 调用类构造函数。
- 将类实例放入由 operator new 创建的内存位置
我不知道这些步骤的顺序。我不知道如何独立于在堆栈上创建该类型的新变量来调用类构造函数。而且我不知道如何将新的类变量从它开始的地方放入堆中。