当前位置: 首页 > 知识库问答 >
问题:

在Linux上编译C++代码。需要使用GCC/4.7.2。找不到标准库

邬承悦
2023-03-14

就处理编译/链接错误而言,我是一个新手。

我正在使用一个很大的C++代码(还有一些C文件)。我已经成功地在Mac上运行了它,用G++编译。现在我需要在基于Linux的集群上运行它,因为它在我的Mac上太慢了。代码由我必须编译的几个库组成,加上我自己使用这些库的代码。

我可以使用默认的g++编译器编译集群上的所有代码。然而,不幸的是,我已经发现我需要用GCC/4.7.2进行编译,这样代码将与集群上的其他软件一起工作。我一直在通过编译和链接错误的方式工作。到目前为止,它们都与C++和C有关。例如,我不得不在一些C文件中添加“extern”。我不得不将包含从C++修改为C头。

我的问题似乎是与一个特定的库(我已经成功地处理了所有其他的)。它在其目录中进行编译。但是当我转到我的运行目录时,我得到了各种似乎与组成这个问题库的代码有关的错误。我的猜测是,它们主要与找不到标准库有关。我只是不明白我的包含怎么会有问题,如果有人能看一下我在这个库的makefile中有什么东西,我会非常感激。这个库是基于“C++”的,但它的文件中似乎有很多C风格的代码。

code.cpp:(.text+0x35):对`std::cout'的未定义引用

我的makefile包含和编译器选项如下。我最初使用Qt在Mac上创建了这个。我对它进行了修改,使其与GCC/4.7.2上的Linux集群一起工作。所以完全有可能有点乱。

首先我做(终端中的命令行):

定义=-dipmgemplugin-dnoparticlearray-d__unix

CFLAGS=-C-G-O2-Pedantic-FNO-NONANSI-Builtins-D__UNIX-M64

CXXFLAGS=-管道-O2-Wall-W-FPIC$(定义)-LSTDC++-M64

             -I/mounts/apps/gcc/4.7.2/ \

             -I/mounts/apps/gcc/4.7.2/bin/ \

             -I/mounts/apps/gcc/4.7.2/bin/x86_64-unknown-linux-gnu/4.7.2 \

             -I/mounts/apps/gcc/4.7.2/lib64 \

             -I/mounts/apps/gcc/4.7.2/bin/include \

             -I/mounts/apps/gcc/4.7.2/bin/include/c++ \

             -I/mounts/apps/gcc/4.7.2/4.7.2/bin/include/c++/4.7.2 \

后缀:.o.c.cpp.cc.cxx.c

.cpp.o:$(CC)-C$(CXXFLAGS)$(INCPATH)-O“$@”“$<”

.CC.o:$(CC)-C$(CXXFLAGS)$(INCPATH)-O“$@”“$<”

.c.o:$(CC)-C$(CFLAGS)$(INCPATH)-O“$@”“$<”

现在我得到的各种错误:

code.o:在函数_zstlsist11char_traitsiceerst13basic_ostreamict_es5_pkc.part.8':code.cpp:(.text+0x12):未定义引用std::basic_ios>::clear(std::_ios_iostate)'code.o:在函数_zstlsist11char_traitsiceerst13basic_ostreamict_es5_pkc.constprop.101':code.cpp:(.text+0x35):未定义引用std:::cout'code.cpp:(.text+0x3a):未定义引用`std::basic_ostream>&std::__ostream_insert

(std::basic_ostream>&,char const*,long)“code.cpp:(.text+0x3f):对std::cout”code.cpp:(.text+0x49):对std::cout“code.cpp:(.text+0x53):对std::cout”code.cpp:(.text+0x53):对函数_znst14basic_ofstreamicst11char_traitsicee4openepkcst13_ios_openmode.constprop.99“:code.cpp:(.text+0x93):对std::basic_file>的未定义引用buf >::open(char const*,std::_ios_openmode)”code.o:In function _znst18basic_stringstreamicst11char_traitsiceSaiceEC1est13_ios_openmode.constprop.96“:code.cpp:(.text+0x103):对std::ios_base::ios_base()”code.cpp:(.text+0x10b):对vtable的未定义引用:对std::basic_ios的未定义引用:对vtable的未定义引用:对vtable的未定义引用:对vtable的未定义引用对于std::basic_stringstream ,std::allocator >'code.cpp:(.text+0x15d):对 std::basic_iostream>::basic_iostream()'代码的未定义引用。cpp:(.text+0x16C):未定义对vtable的引用(用于std::basic_stringstream ,std::allocator >'code.cpp:(.text+0x174):未定义对 vtable的引用(用于std::basic_stringstream,std::allocator>'code.cpp:(.text+0x17C):未定义对vtable的引用(用于std::basic_stringstream ,std::allocator 'code.cpp:(.text+0x184):未定义对 vtable的引用)定义了对vtable for std::basic_streambuf>的引用‘

再往下说:

gl3.cpp:(.text+0x18d):对`operator new[](无符号长)‘的未定义引用

gl3.cpp:(.text+0x1A1):对`operator new[](无符号长)‘的未定义引用

gl3.cpp:(.text+0x1dd):对`operator new[](无符号长)‘的未定义引用

/data/place/number/account/codedirectory/../problemlibrarydirectory/libproblem.a(gl3.o):函数other::free_internal()“:gl3.cpp:(.text+0x251):未定义引用运算符delete”gl3.cpp:(.text+0x262):...

这些对任何人都有意义吗?


共有1个答案

东方权
2023-03-14

您使用的是C++函数,如newstd::*函数,因此必须使用C++编译器进行编译(除非您将C编译版本与C++库链接)。GCC是一个C编译器,g++是GNU C++编译器,所以您应该使用g++。

我在你的一篇评论中看到,出于某种原因,你不得不使用GCC。如果是这种情况,则必须从程序中删除所有特定于C++的代码(例如std::*new/delete),或者链接到C++库。然而,我看不出有任何理由你应该使用gcc。请解释为什么你必须使用GCC,然后我们可能会帮助你进一步。

 类似资料:
  • 在Linux上如何使用gcc编译c程序 如何安装gcc 编辑c代码 编辑代码 运行代码

  • 问题内容: 现在,我已经在Windows 7上成功安装了Cython,我尝试使用Cython编译一些Cython代码,但是gcc使我的生活变得艰难。 使用gcc编译代码时,会抛出数十个 对 -erros的 未定义引用 ,并且我很确定src是可用的(如安装教程所述,如果缺少此文件,则会抛出 对 -errors的 未定义引用 )。 奇怪的是,使用*或-script可以很好地工作,但是当仍然在模块上工作

  • 在中,我有: 在中,我有: 当我在Windows10上编译这个项目时,无论是使用还是,它都能完美地编译和工作。

  • 代码不编译。我不明白错误是什么,请帮忙) 错误文本:g-Wall-c“main.cpp”(/media/ad/4GB-NTFS/prog/laba2)main。cpp:In函数“int main()”:main。cpp:46:12:错误:调用“Record::Record()”记录r1;^主要的cpp:12:1:注意:候选者:Record::Record(std::\u cxx11::string

  • 要知道,任何一门编程语言都有相关的组织和团体在不停的维护和更新。原因很简单,时代在发展,编程语言如果停滞不前,最终就会被淘汰。 以 C 语言为例,发展至今该编程语言已经迭代了诸多个版本,例如 C89(偶尔又称为 C90)、C94(C89 的修订版)、C99、C11、C17,以及当下正在开发的 C2X 新标准。甚至于在这些标准的基础上,GCC 编译器本身还对 C 语言的语法进行了扩展,先后产生了 G

  • 我编译了以下C代码: 使用命令 .下面是输出中的 Bar 函数: 我有几个关于这个汇编代码的问题: > 如果函数体中既没有使用也没有使用rsp,那么"",""和""的目的是什么? 为什么和自动包含C函数的参数(分别为和)而不从堆栈中读取它们? 我尝试将Foo的大小增加到88字节(11s),指令变成了。将我的结构设计为“圆形”大小以避免乘法指令(以优化数组访问)是否有意义?指令被替换为: