线程程序与g ++一起运行,但不与gcc一起运行

时间:2019-02-18 03:57:44

标签: gcc g++

我已经使用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();
}

3 个答案:

答案 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标志。