[英]Linking to static C++ library on Mac OS X: global object constructor from library is not called
[英]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.