我有一个混合的 Free Pascal/C++ 项目。在 i386、FPC 2.4.4 上的 Debian 5.0(“Lenny”)。当我运行该程序时,它会在第一个 cout<<
崩溃称呼。有趣的是,它曾经工作了一段时间;一些操作系统更新可能破坏了它。这是孤立的问题:
p.pas:
{$L c.o}
program p;
uses initc;
procedure Hello; cdecl; external name 'Hello';
begin
Hello;
end.
c.cpp:
#include <iostream>
//void * __dso_handle; //You might need to uncomment that
extern "C" void Hello()
{
std::cout << "Hello world";
}
生成文件:
p : c.o p.pas Makefile
fpc p.pas -k-lstdc++
c.o : c.cpp
g++ -c c.cpp
制作、运行、段错误。在全新的 Debian VM 上尝试过 - 结果相同。
崩溃发生在 basic_fstream::sentry::sentry() 中。他们声称这个崩溃位置与全局 cout
一致对象未被初始化。这很奇怪 - 我想使用 initc
从 Pascal 端确保全局 C++ 变量已初始化。
有什么想法吗?它会不会是我要链接的 libstdc++ 版本(它是 libstdc++.so.6.0.10)?
编辑:它变得越来越奇怪。我在 CentOS 5.3 机器上运行相同的二进制文件 ( p
) - 它像宣传的那样工作。所以可能是关于共享库版本...我会去收集更多关于不同 Linux 的统计数据。
EDIT2:我注意到一件事:当我做 ldd p
时在我的 Debian 机器上,这是我得到的:
linux-gate.so.1 => (0xb77a6000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb76a6000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb754b000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7524000)
/lib/ld-linux.so.2 (0xb77a7000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7517000)
当我在它工作的 CentOS 机器上做同样的事情时:
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7ec2000)
libc.so.6 => /lib/libc.so.6 (0xb7d69000)
libm.so.6 => /lib/libm.so.6 (0xb7d40000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7d34000)
/lib/ld-linux.so.2 (0xb7fb7000)
所以所有的 C 库(只是 C++ 库除外)都来自 i686/cmov
目录。 Debian 机器也有 /lib/libc.so.6
, 它与 cmov
中的不同.那有什么关系 cmov
目录?为什么两个不同的 libc 拷贝具有相同的名称?
编辑:即使在 CentOS 上,也不会调用全局构造函数 - 只是使用临时全局对象进行测试。由于某种原因,它不会在 sentry() 中崩溃。看起来这毕竟是 FPC 问题。有一个 bug report在关于此行为的 FPC 中。
最佳答案
事实上,我尝试明确链接到一个静态 c.o(具有所有不同版本的 libstdc++。所以我可以在我的盒子上找到)并且我遇到了同样的失败:
Runtime error 216 at $00007F3B9C9EFAD1
$00007F3B9C9EFAD1
我很快就会尝试旧的安装。 更新 也无法使链接 c.o 在 Maverick 上工作(gcc 4.4.5 和 fpc 2.4.0-2ubuntu1.10.10)。
只有在更改为动态链接后,我才让它在我的 Natty box 上运行:
在 p.pas 中:
{$L c.so}
生成文件
p : c.so p.pas Makefile
fpc p.pas
c.so : c.cpp
g++ -shared -fPIC c.cpp -o $@
运行
$ LD_LIBRARY_PATH=$PWD
$ ./p
Hello world
关于c++ - 免费的 Pascal/C++ 项目在 cout::sentry 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174998/