我在程序中使用了STL,但是下载时,出现了链接错误:
Errors while downloading PPCEC603gnu/Project1.out: clone__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i03Rep eos__t18string_char_traits1Zc replace__t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0UiUiPCcUi _t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0$nilRep __dl__Q2t12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i03RepPv length__t18string_char_traits1ZcPCc assign__t18string_char_traits1ZcRcRCc
程序代码如下:
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <cstdio>
using namespace std;
int main(void)
{
map<int, int> mapInt;
mapInt[12] = 1222;
mapInt[13] = 1333;
if (1222 == mapInt[12])cerr << "Right!\n";
if (1333 == mapInt[13]) cerr << "Right!\n";
string str = "hello";
printf("%s\n", str.c_str());
vector<int> arrInt;
arrInt.push_back(2);
arrInt.push_back(3);
vector<int>::iterator itArrInt;
for (itArrInt = arrInt.begin(); itArrInt != arrInt.end(); ++itArrInt)
{
cerr << *itArrInt << "\t";
}
cerr << endl;
return 0;
}
但是,VxWorks是支持STL的。在VxWorks Programmer's Guide中有明确表明STL:
Standard Template Library (STL) For both toolchains, the Standard Template library consists entirely of a set of header files. There is no special run-time component that must be included in a VxWorks system.
STL for GNU The GNU STL port for VxWorks is thread safe at the class level. This means that the client has to provide explicit locking, if two tasks want to use the same container object (a semaphore can be used to do so; see 2.3.3 Semaphores). However, two different objects of the same STL container class can be accessed concurrently.
The C++ Standard Template Library can be used in client code compiled with exception handling turned off. In our implementation this has the following semantics:
For all checks that could reasonably be made by the caller, such as bounds checking, no action is taken where an exception would have been thrown. With optimization on, this is equivalent to removing the check. For memory exhaustion where bad_alloc would have been thrown, now the following message is logged (if logging is included): "STL Memory allocation failed and exceptions disabled -calling terminate" and the task calls terminate. This behavior applies only to the default allocators; you are free to define custom allocators with a different behavior.
在FAQ上也发现,它是支持STL的,只不过会使代码显得比较大:
Q. When compiling C++ code (STL) the object size explodes
A: People are confusing C++ with STL. They are not the same. There is an embedded C++ standard that will significantly reduce the size of an executable if you follow the restrictions.
Compile with "-fno-exceptions". If you are using templates that require exceptions handling, i suggest you don't. Alternatively, you can look that the offending vxWorks STL file (maybe stl_alloc.h) and there is an "if 0" condition that should be changed to "if 1". Also disable RTTI with "-fno-rtti" as the another poster noted. You might also consider using "-fno-volatile", etc.
If you don't use templates, but just classes and polymorphism, you can make your own collections that are significantly smaller than STL. (even when you do use templates).
Other alternatives might be to look at PJ Plaugher's STL.
(From: Bill Pringlemeir, spam_account@sympatico.ca)
而且,对于set, map, vector,都没有报错,只有string报错。经过反复查找资料,才确定只与string无关,与STL有关,并且在programmer's guide中以下描述:
7.2.2 Adding Support Components
By default, VxWorks kernels contain only minimal C++ support. You can add C++ functionality by including any or all of the following components:
Basic Support Components
...
C++ Library Components
Several C++ library components are also available.
GNU-Specific Library Support Components
For the GNU compiler, these are:
INCLUDE_CPLUS
Includes all basic C++ run-time support in VxWorks. This enables you to download and run compiled and munched C++ modules.
INCLUDE_CPLUS_STL
Includes support for the standard template library.
INCLUDE_CPLUS_STRING
Includes the basic components of the string type library.
这时候,再去查看configAll.h,才发现确实未定义INCLUDE_CPLUS_STRING宏。
结论:对编译过程、库、gcc了解太少了,查起这种问题,根本没有头绪。