Потоковая программа работает с G ++, но не с GCC - PullRequest
0 голосов
/ 18 февраля 2019

Я скомпилировал код c ++, используя g++ -std=c++11 -o main main.cpp -pthread, и он скомпилировался нормально, однако, если я скомпилировал тот же код, используя 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 голосов
/ 18 февраля 2019

Я полагаю, что полученная вами ошибка выглядит примерно так:

/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 голосов
/ 22 февраля 2019

Если вы написали код C ++ с помощью GCC, вы будете знать, что вам нужно использовать программу g ++ как для компиляции, так и для компоновки.Для многомодульных программ это означает, что каждый файл .cpp компилируется с g ++, а затем вся программа должна быть связана отдельно с использованием g ++.Если вы попытаетесь связать программу, используя gcc, она почти сработает, но вы получите много ошибок «неопределенная ссылка», например:

test.cpp :(. Text + 0x11): undefinedссылка на `std :: cout 'Необходимость использования g ++ для связывания всей программы вызывает проблемы, когда у вас очень сложный процесс сборки, которым вы не обладаете полным контролем.Например, я пытаюсь связать код C ++ с Mercury, и мне нужно использовать компоновщик Mercury, который, в свою очередь, вызывает gcc.

Так что просто быстрый совет: если вы вынуждены использовать gcc для ссылкипрограмму, просто добавьте библиотеку «stdc ++», как и любую другую библиотеку, и она будет работать.То есть добавьте параметр «-lstdc ++» в командную строку компоновщика GCC.Например:

g ++ -c hello.cpp

gcc -lstdc ++ -o hello hello.o

0 голосов
/ 18 февраля 2019

Попробуйте добавить флаг -lrt после pthread.

...