C++ c++;freebsd上但linux或mac os x上不存在构造函数核心转储的异常

C++ c++;freebsd上但linux或mac os x上不存在构造函数核心转储的异常,c++,exception-handling,g++,cmake,freebsd,C++,Exception Handling,G++,Cmake,Freebsd,为什么下面列出的程序在MacOSX和linux上运行,而不是在freebsd上运行 抛出异常后,freebsd core将转储,并显示以下消息: terminate called after throwing an instance of 'ObjectException' what(): error not allowed [1] 28946 abort (core dumped) ./bin/main 在这三种平台上,我都使用gnu编译器 freebsd g++--版本:g+

为什么下面列出的程序在MacOSX和linux上运行,而不是在freebsd上运行

抛出异常后,freebsd core将转储,并显示以下消息:

terminate called after throwing an instance of 'ObjectException'
  what():  error not allowed
[1]    28946 abort (core dumped)  ./bin/main
在这三种平台上,我都使用gnu编译器

freebsd g++--版本:g++(GCC)4.2.1 20070719

mac os x g++--版本:i686-apple-darwin10-g++-4.2.1

linux g++--版本:g++(Gentoo 4.3.3 p1.0,pie-10.1.5)

freebsd uname-a:8.1-发布freebsd 8.1-发布

我使用cmake创建Makefile,因此在每个平台上都是相似的

清单如下:

标题

#ifndef GUARD_Object_h
#define GUARD_Object_h

#include "boost/scoped_ptr.hpp"
#include "string"
#include "exception"

using std::string;

class Object
{
private:
    boost::scoped_ptr<string> _name;
public:
    Object(const string&);
    string getName();
};

class ObjectException:public std::exception
{
    virtual const char* what() const throw()
    {
        return "error not allowed";
    }
};

#endif
主要

#包括
#包括“Object.h”
int main()
{
尝试
{
新对象(“错误”);
}catch(ObjectException&){

std::cout我在FreeBSD 8.1上编译并运行了你的代码,没有任何问题(使用
g++-I/usr/local/include-g Main.cpp Object.cpp
)。也许你需要在那台计算机上升级(重新安装)boost?

在FreeBSD 8.1-RELEASE-p2和OSX 10.6.6上对我有效

您的搜索路径中可能有libstdc++的错误版本。当我链接到FreeBSD 8.1时,我从ldd获得以下输出:

janm@midgard: test3 $ ldd a.out
a.out:
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x800649000)
    libm.so.5 => /lib/libm.so.5 (0x800854000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800973000)
    libc.so.7 => /lib/libc.so.7 (0x800a80000)
如果您的运行库看起来明显不同,则可能存在运行库不匹配的问题。如果有问题,可以尝试使用“g++-static”链接,以便在链接时静态链接运行库。如果有效,则需要修复计算机

更新:

您的编译器和运行库似乎不匹配,这可能是由cmake配置问题造成的。您可能已将gcc版本安装到/usr/local中,可能使用了端口

如果使用system gcc编译,则需要与/usr/lib中的运行时库链接。如果使用/usr/local中的gcc编译,则需要与/usr/local中的库链接。如果您计划分发二进制文件,则可能应该使用system gcc或静态链接


另一种选择是卸载gcc端口,然后再试一次,假设你真的不关心gcc端口。

请你将boost::scoped_ptr更改为boost::shared_ptr并再次测试它。shared_ptr会给出相同的结果,而且当我不使用智能指针时,它会得到核心转储。我确认这一点。在FreeBSD 8.1和OSX 10.6.6上运行良好我。核心转储中的堆栈跟踪显示了什么?啊,它一定是与cmake有关,如果我用你给它的命令测试它,它实际工作,如果我用cmake生成的Makefile编译,它的核心转储将与-static一起工作,所以我想我必须重新安装,或者cmake链接了错误的libs-(您从/usr/local/lib获取gcc库,因此您可能安装了gcc端口,或者您手动安装了gcc。如果您使用系统gcc编译,则需要与/usr/lib中的运行时库链接。如果您使用/usr/local中的gcc编译,则需要与/usr/local中的库链接。如果您计划运送bin在这里,您可能应该使用系统gcc或静态链接。是的,您可能有cmake配置问题。另一个选项是(如果您不关心端口gcc)只需卸载gcc端口,让cmake重新了解环境,然后重试。@Cyberroadie您可以运行
find/-name libstdc++.so.6
来查找libstdc++的不同实例所在的位置。
#include <iostream>
#include "Object.h"

int main() 
{
    try
    {
        new Object("error");
    } catch(ObjectException& ) {
        std::cout << "error found" << std::endl;
    }
}
janm@midgard: test3 $ ldd a.out
a.out:
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x800649000)
    libm.so.5 => /lib/libm.so.5 (0x800854000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x800973000)
    libc.so.7 => /lib/libc.so.7 (0x800a80000)