线程程序用g ++运行但不用gcc运行

问题描述 投票:3回答:3

我已经使用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 g++
3个回答
2
投票

如果你用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


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编译器驱动程序编译C ++程序,就像g++一样,但是当调用链接器时,程序被视为C程序,这通常会导致链接器错误。


0
投票

尝试在pthread之后添加-lrt标志。

© www.soinside.com 2019 - 2024. All rights reserved.