我已经使用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();
}
答案 0 :(得分:2)
如果您是用GCC编写的C ++代码,那么您将需要使用g ++程序进行编译和链接。对于多模块程序,这意味着将使用g ++编译每个.cpp文件,然后必须使用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
答案 1 :(得分:1)
我认为您收到的错误看起来像这样:
/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
编译器驱动程序像g++
一样编译C ++程序,但是当调用链接器时,该程序被视为C程序,通常会导致链接器错误。
答案 2 :(得分:0)
尝试在pthread一个之后添加-lrt
标志。