[英]How to build object using C++ vector library in gcc?
所以我有一些在makefile中调用gcc的工作代码。 然后,我添加使用c ++向量stl的自己的类,并且希望编译同一对象。
如果我只运行同一命令,则会收到错误消息:
fatal error: vector: No such file or directory
#include <vector>
如果我尝试使用g ++代替进行编译,则会得到一百万个错误,因此我猜测我不应该这样做。
我用谷歌搜索了如何向gcc调用中添加c ++库,并被告知要使用
gcc -lstdc++
但是,这似乎没有任何作用。 我该如何建立这个物件?
使用g ++是标准方法吗? 如果我使用g ++而不是gcc,似乎有很多这种类型的转换错误:
globals.c:1381:50: error: invalid conversion from 'void*' to 'Global*' [-fpermissive]
struct Global *g = calloc(1,sizeof(struct Global)); /* allocate viewer context */
以及先前声明的错误:
d:\mingw\include\getopt.h:46:12: error: previous declaration 'int getopt(int, char* const*, const char*)' here
extern int getopt( int, char * const [], const char * );
这里有很多问题。 首先,“ gcc”可执行文件将同时编译C和C ++代码,但通常会根据文件后缀确定应将其编译为C还是C ++。 在您的情况下,似乎已尝试将“ globals.c”编译为C源文件而不是C ++源文件。 C编译器没有在内部包含路径列表中包含正确的目录,因此它甚至不会尝试打开<vector>包含。 要编译为C ++,可以使用g ++或通过将源文件的名称更改为具有.cpp或.C后缀的方式来强制使用。
如果您有多个源文件,那么您将需要做更多的工作。 您可能需要用C ++编译器编译所有内容,或者需要学习“ extern'C'”并修复C ++和C之间的接口。这可能比实际情况麻烦得多。
接下来,您将需要解决编译中的所有错误。 看来您显示的主要问题与类型转换有关。 在C下,这些比在C ++中更宽容。
我建议您取出矢量代码,并继续使用纯C解决方案。 您必须自己执行内存管理,但这并不难。 我过去曾使用realloc()来调整内存大小。 您需要跟踪指向已分配内存的指针,已分配对象的数量以及缓冲区的总大小。
第一个错误是因为c ++中没有从void *
到其他指针类型的自动转换。 在c中不是这种情况,因此代码可以使用ac编译器正确编译,以解决您只需要像这样强制转换返回值
Global *g = reinterpret_cast<Global *>(calloc(1,sizeof(Global)));
还要注意,您不需要在C ++中使用struct
进行声明。
我建议使用new
运算符,因为如果您向struct Global
添加一个构造struct Global
,它将自动调用cosntructor,
Global *g = new Global;
但是请注意,与calloc()
不同,此处的struct成员未初始化为0
。
重要的是要知道c和c ++是不同的语言,您可以轻松编写将使用ac编译器而不是c ++编译器进行编译的代码,例如上面的代码,反之则更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.