所以我在一个我们无法链接任何运行时库或使用异常的环境中工作。但是我们希望利用BOOST或STL。最初我们尝试在boost :: container :: string / vector / map / ...中进行链接,但无法解决链接器错误。
所以目前我正在尝试链接STL的头文件,为此我定义了以下预处理器指令:
#define _HAS_ITERATOR_DEBUGGING 0
#define _HAS_EXCEPTIONS 0
我能够成功链接#include并且我能够实例化一个std :: vector,但是当我调用push_back(32)时;在向量上我遇到以下链接器错误:
error LNK2001: unresolved external symbol "void (__cdecl* std::_Raise_handler)(class stdext::exception const &)" (?_Raise_handler@std@@3P6AXAEBVexception@stdext@@@ZEA)
error LNK2001: unresolved external symbol _invoke_watson
error LNK2001: unresolved external symbol "void __cdecl std::_Xlength_error(char const *)" (?_Xlength_error@std@@YAXPEBD@Z)
我们正在使用visual studio 2010(它是默认的编译器)。我们希望在不久的将来迁移到vs2012,如果它有助于解决这些错误,可以加快速度。
有没有办法在这些限制下链接boost或STL(没有例外,没有运行时库)?
谢谢!由于我们的环境限制,我们真的不想错过STL / boost的好处
答案 0 :(得分:3)
这取决于你需要什么,但可能不是。
C ++标准库中的所有容器都需要内存分配,它包含在运行时库中。所以,你不能拥有:
std::vector<>
std::set<>
std::map<>
std::list<>
您可以使用
std::array<>
std::tuple<>
但你可能也不会。
所有流都需要内存分配,大多数流都需要文件i / o系统调用,所以它们也都没有。
由于您无法使用容器,因此迭代器的大部分功能都不再有用。
好消息是大多数Boost支持仅限于标题,因此您无需与Boost库链接。对于Boost,只需尝试#include
相应的标题即可。如果它编译和链接,你就赢了。
答案 1 :(得分:2)
首先,澄清一点。您不需要Boost来使用标准模板库。很久很久以前,STL作为C ++标准库的一部分被并入C ++。您已经将它作为visual studio 2010的一部分。
您需要通过“无法链接任何运行时库”来阐明您的意思。您是否甚至不允许使用标准的C和C ++运行时库?这意味着没有I / O,没有数学函数,没有new
,没有delete
,没有没什么。如果您被允许使用标准库,那么您已经拥有STL。
std::bad_alloc
,当您使用检查事物是否在范围内的访问器时,它们会抛出std::out_of_range
。有很多{{1}的调用在那些标准标题中。
您的“无抛出异常”是否仅适用于您,或者它是否也适用于标准库?如果它适用于库以及程序员,则可以注销C ++容器,C ++ I / O,C ++字符串以及几乎所有的Boost。
答案 2 :(得分:1)
为了消除标准库中的异常,您需要一个不使用异常的库构建。设置这些宏是构建和使用此类库的一部分。我不认为微软发布了他们的库的无异常版本,但是如果他们这样做,你需要链接到它而不是正常的。如果没有,您需要考虑从提供给Microsoft的公司Dinkumware授权库。 www.dinkumware.com。