我已经使用g++ -std=c++11 -o main main.cpp -pthread
编译了一个c ++代码并且编译得很好但是如果我使用gcc -std=c++11 -o main main.cpp -pthread
编译相同的代码它不会编译并抛出错误。该程序使用线程,在编译时正确使用-pthread
选项。作为参考,我附上下面的代码。任何帮助都非常感谢。
#include <iostream>
#include <thread>
class foo
{
public:
void bar(int loop_num)
{
for (int i = 0; i < loop_num; ++i) {
std::cout << "Thread executing\n";
++n;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
int n = 0;
};
int main()
{
int n = 0;
foo f;
std::thread t1(&foo::bar, &f, 5);
t1.join();
}
如果你用GCC编写了C ++代码,你就会知道你需要使用程序g ++来编译和链接。对于多模块程序,这意味着每个.cpp文件都使用g ++编译,然后整个程序必须使用g ++单独链接。如果你尝试使用gcc链接程序,它几乎可以工作,但你会得到很多“未定义的引用”错误,如下所示:
test.cpp :(。text + 0x11):对`std :: cout'的未定义引用当你有一个非常复杂的构建过程而你没有完全控制时,需要使用g ++链接整个程序会导致麻烦。例如,我正在尝试将C ++代码与Mercury链接,我必须使用Mercury链接器,后者又调用gcc。
所以只是一个快速提示:如果您被迫使用gcc链接程序,只需添加库“stdc ++”,就像任何其他库一样,它将起作用。也就是说,将选项“-lstdc ++”添加到GCC链接器命令行。例如:
g ++ -c hello.cpp
gcc -lstdc ++ -o hello hello.o
我假设你得到的错误看起来像这样:
/tmp/ccUKAq0K.o: In function `main':
main.cpp:(.text+0x59): undefined reference to `std::thread::join()'
/tmp/ccUKAq0K.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0xb6): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0xcb): undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccUKAq0K.o: In function `std::thread::~thread()':
main.cpp:(.text._ZNSt6threadD2Ev[_ZNSt6threadD5Ev]+0x1d): undefined reference to `std::terminate()'
(等等。)
使用标准库(因此大多数)的C ++程序需要使用g++
而不是gcc
进行链接。只有g++
编译器驱动程序链接在大多数标准库中。 gcc
编译器驱动程序编译C ++程序,就像g++
一样,但是当调用链接器时,程序被视为C程序,这通常会导致链接器错误。
尝试在pthread之后添加-lrt
标志。