在 Linux 上编译C++代码。需要使用 gcc/4.7.2。找不到标准库
Compiling C++ code on Linux. Need to use gcc/4.7.2. Can't locate standard libraries
处理编译/链接错误而言,我有点新手。
我正在使用一个大的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++函数,例如new
和std::*
函数,因此您必须使用C++编译器进行编译(除非您将 C 编译版本与C++库链接(。GCC是一个C编译器,G++是GNU C++编译器,所以你应该使用G++。
我在您的一条评论中看到,由于某种原因,您不得不使用 GCC。如果是这种情况,那么您将不得不从程序中删除所有C++特定代码(例如 std::*
和new
/delete
(,或链接到C++库。但是,我认为没有任何理由必须使用GCC。请解释为什么您必须使用GCC,然后我们可能能够进一步帮助您。
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- <concepts> 使用 GCC 试用标准库
- 我可以停止 GCC 将标准库名称包含在全局命名空间中吗?
- 安装 GCC 7.1 是否会在标准库中包含 std::is_base_of_v
- GCC 如何实现 C++ 标准分配器
- Mac OS X 上的 GCC 7 找不到C++标准库
- 即使明确指定了98个标准,GCC也使用C 11标准
- 他们实现的开源C编译器(gcc,clang)的实际标准在哪里
- 将不同的C 标准与GCC混合
- 如何编辑和重新构建GCC libstdc++C++标准库源代码
- 如何在windows中的gcc中逐行读取命令输出,就像使用标准输入一样
- 为什么根据 C++11 标准,std::seed_seq是不可复制的,为什么 gcc/clang 不符合?
- 不能包含使用 GCC-G++ 的标准C++库文件
- C++,我可以在其中找到 gcc 编译器标准库的实现文件
- 标准::矢量的概念和GCC实现
- 哪个gcc和g++版本支持c和c++的哪个标准
- 如何告诉GCC不要与运行库和标准库链接
- C++11 GCC 4.6.2标准::移动
- GCC-标准库中的致命错误,包括