繁体   English   中英

如何在gcc中使用C ++矢量库构建对象?

[英]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

重要的是要知道cc ++是不同的语言,您可以轻松编写将使用ac编译器而不是c ++编译器进行编译的代码,例如上面的代码,反之则更容易。

暂无
暂无

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

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