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

Compiling C++ code on Linux. Need to use gcc/4.7.2. Can't locate standard libraries

本文关键字:gcc 标准 找不到 编译 Linux C++ 代码      更新时间:2023-10-16

处理编译/链接错误而言,我有点新手。

我正在使用一个大的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"的未定义引用

我的制作文件包含和编译器选项如下。 我最初使用 QT 在我的 Mac 上创建了这个。 我修改了它以在 gcc/4.7.2 上与 Linux 集群一起使用。 所以完全有可能有点混乱。

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

模块加载 GCC/4.7.2

然后生成文件是:

CC = 海湾合作委员会

定义 = -DIPMGEMPLUGIN -DNOPARTICLEARRAY -D__unix

CFLAGS = -c -g -O2 -pedantic -fno-nonansi-builtins -D__unix -m64

CXXFLAGS = -pipe -O2 -Wall -W -fPIC $(DEFINES( -lstdc++ -m64

INCPATH = -I. \

             -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 

AR = ar cq RANLIB = ranlib -s TARGET = mylib.a

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

.cpp.o: $(CC( -c $(CXXFLAGS( $(INCPATH( -o "$@" "$<">

.

cc.o: $(CC( -c $(CXXFLAGS( $(INCPATH( -o "$@" "$<">

.

cxx.o: $(CC( -c $(CXXFLAGS( $(INCPATH( -o "$@" "$<">

.C.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): undefined reference to std::basic_ios>::clear(std::_Ios_Iostate)' Code.o: In 功能 _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc.constprop.101': Code.cpp:(.text+0x35): undefined reference to std::cout' 代码.cpp:(.text+0x3a(:未定义的引用 'std::basic_ostream>& 标准::__ostream_insert

(std::basic_ostream>&, char const*, long(' Code.cpp:(.text+0x3f(: 对std::cout' Code.cpp:(.text+0x49): undefined reference to std::cout' 的未定义引用 代码.cpp:(.text+0x53(:对std::cout' Code.o: In function _ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode.constprop.99'的未定义引用: 代码.cpp:(.text+0x93(:未定义的引用 std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode)' Code.o: In function _ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode.constprop.96': 代码.cpp:(.text+0x103(:未定义的引用 std::ios_base::ios_base()' Code.cpp:(.text+0x10b): undefined reference to vtable for std::basic_ios ' Code.cpp:(.text+0x11b(:未定义对VTT for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >' Code.cpp:(.text+0x15d): undefined reference to std::basic_iostream>::basic_iostream((' 的引用 Code.cpp:(.text+0x16c(:对 std::basic_stringstream 的 vtable for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >' Code.cpp:(.text+0x174): undefined reference to vtable 的未定义引用, std::分配器>' 代码.cpp:(.text+0x17c(:未定义的引用 vtable for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >' Code.cpp:(.text+0x184): undefined reference to vtable for std::basic_streambuf>'

再往前走:

gl3.cpp:(.text+0x18d(:对"运算符 new[](unsigned long("的未定义引用

gl3.cpp:(.text+0x1a1(:对"运算符 new[](无符号长整型("的未定义引用

GL3.cpp:(.text+0x1b5(:未定义对"运算符new[](unsigned long("的引用

gl3.cpp:(.text+0x1c9(:对"运算符 new[](unsigned long("的未定义引用

GL3.cpp:(.text+0x1dd(:未定义对"运算符 new[](无符号长整型("的引用

/

data/place/number/account/CodeDirectory/../ProblemLibraryDirectory/libProblem.a(gl3.o(: 在函数Other::free_internal()': gl3.cpp:(.text+0x251): undefined reference to运算符中删除' gl3.cpp:(.text+0x262(: ...

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

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

我在您的一条评论中看到,由于某种原因,您不得不使用 GCC。如果是这种情况,那么您将不得不从程序中删除所有C++特定代码(例如 std::*new/delete(,或链接到C++库。但是,我认为没有任何理由必须使用GCC。请解释为什么您必须使用GCC,然后我们可能能够进一步帮助您。