为什么 -pthread 工作但 -lpthread 不工作?

Why -pthread working but -lpthread does not?

我已成功将我的简单 gtest 测试与命令链接起来 g++ -o build/test1 build/test1.o -pthread -lgtest -lgtest_main

但我对选项 -pthread 很好奇。为什么它不能与 -lpthread 一起使用 它与 -lgtest 一起工作。

以及为什么 -gtest 不工作但没有 "l" 的 -pthread 工作...

gcc 中,-pthread 标志指示编译器它应该设置允许线程代码的东西。我相信(但我不是绝对确定)它所做的 一个 是添加 -lpthread 以便链接器在搜索未解析的符号时使用相关的库。

但是,它还做其他事情,比如设置-D_REENTRANT来指定使用可重入代码。

换句话说,-lpthread 本身可能不够,因为它 指定应搜索线程库。我倾向于使用 both 来确定它做了正确的事情 - 是的,我 am 偏执狂:-)

I have successfully linked my simple gtest test with command g++ -o build/test1 build/test1.o -pthread -lgtest -lgtest_main

but i'm curios about options -pthread. Why it is not working with -lpthread as it working with -lgtest.

命令行中库 link 选项的顺序很重要。我认为您尝试简单地将 -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

虽然这不是使用 g++ 构建 pthreads 代码的合适方法(如您的其他答案中所述),但它通常确实有效。

And why -gtest doest not working but -pthread without "l" is working...

-pthread 是 GCC 编译器套件识别的 specific 编译选项。 -lgtestgeneral -l 选项与 gtest 作为选项参数的组合。也可以编写类似的 -lpthread 选项,原则上,它与 -pthread.

的含义有些不同