繁体   English   中英

来自freebsd上构造函数核心转储的c ++异常,但不是Linux或Mac OS X上的c ++异常

[英]c++ exception from constructor core dumps on freebsd but not on linux or mac os x

为什么下面列出的程序可以在Mac OS X和Linux上运行,而不能在FreeBSD上运行?

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

terminate called after throwing an instance of 'ObjectException'
  what():  error not allowed
[1]    28946 abort (core dumped)  ./bin/main

在所有三个平台上,我都使用gnu编译器

freebsd g ++ --version:g ++(GCC)4.2.1 20070719

Mac OS X G ++-版本:i686-apple-darwin10-g ++-4.2.1

linux g ++ --version: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

主要

#include "Object.h"

Object::Object(const string &name):_name (new string)
{
    *_name = name;
   if(*_name == "error") 
   {  
        throw ObjectException();
   }  
}

string Object::getName() 
{
    return *_name;
}

主要

#include <iostream>
#include "Object.h"

int main() 
{
    try
    {
        new Object("error");
    } catch(ObjectException& ) {
        std::cout << "error found" << std::endl;
    }
}

我在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配置问题引起的。 您可能已使用端口在/ usr / local中安装了gcc版本。

如果使用系统gcc进行编译,则需要与/ usr / lib中的运行时库链接。 如果使用/ usr / local中的gcc进行编译,则需要与/ usr / local中的库链接。 如果您打算运送二进制文件,则可能应该使用系统gcc或静态链接。

另一个选择是只是卸载gcc端口,然后重试,前提是您实际上并不关心gcc端口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM