Почему -pthread работает, а -lpthread - нет? - PullRequest
1 голос
/ 10 апреля 2020

Я успешно связал свой простой тест gtest с командой g++ -o build/test1 build/test1.o -pthread -lgtest -lgtest_main

, но я не знаю ios о параметрах -pthread. Почему он не работает с -lpthread, как он работает с -lgtest.

И почему -gest doest не работает, но -pthread без "l" работает ...

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Я успешно связал свой простой тест gtest с командой g ++ -o build / test1 build / test1.o -pthread -lgtest -lgtest_main

, но я ios об опциях - потоковый. Почему он не работает с -lpthread, так как он работает с -lgtest.

Порядок параметров ссылок библиотеки в командной строке имеет большое значение. Я полагаю, что вы попытались просто изменить -pthread на -lpthread, чтобы получить это:

g++ -o build/test1 build/test1.o -lpthread -lgtest -lgtest_main

Но если библиотека gtest или gtest_main использует какие-либо функции pthreads, тогда должен появиться -lpthread позже в списке библиотек, чем те (библиотеки могут быть перечислены более одного раза, если необходимо):

g++ -o build/test1 build/test1.o -lgtest -lgtest_main -lpthread

Хотя это не подходящий способ для построения кода pthreads с помощью g++ (как описано в вашем другом ответе) обычно это работает.

И почему -gest doest не работает, но -pthread без "l" работает ...

-pthread - это конкретный c параметр компиляции, распознаваемый набором компиляторов G CC. -lgtest - это сочетание общего -l параметра с gtest в качестве аргумента параметра. Можно также написать аналогичный параметр -lpthread, который, в принципе, имеет несколько иное значение, чем -pthread.

1 голос
/ 10 апреля 2020

В gcc флаг -pthread указывает компилятору на то, что он должен установить параметры, разрешающие многопоточный код. Я верю (но я не совсем уверен), что один из того, что он делает, добавляет -lpthread, чтобы компоновщик использовал соответствующие библиотеки при поиске неразрешенных символов.

Тем не менее, он также делает другие вещи, такие как set -D_REENTRANT, чтобы указать использование повторно входящего кода.

Другими словами, -lpthread может быть недостаточно само по себе, поскольку only указывает, что в библиотеке потоков следует искать. Я склонен использовать и , чтобы быть уверенным, что он поступает правильно - да, я я параноик: -)

...