当前位置: 首页 > 知识库问答 >
问题:

尝试在Ubuntu上使用pthread时出错

席俊驰
2023-03-14

我正在阅读有关C中线程的教程并测试了以下代码:

#include <iostream>
#include <pthread.h>
#include <cstdlib>

using namespace std;

#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   cout << "Hello World! Thread ID, " << tid << endl;
   pthread_exit(NULL);
}

int main ()
{
   pthread_t threads[NUM_THREADS];
   int rc;
   int i;
   for( i=0; i < NUM_THREADS; i++ ){
      cout << "main() : creating thread, " << i << endl;
      rc = pthread_create(&threads[i], NULL, 
                      PrintHello, &threads[i]);
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

我试图使用gcc和g编译此代码,但我总是遇到编译错误。

使用gcc-pthread thread_test.c:

/tmp/ccmpQLyp。o: 在函数PrintHello(void*)':thread_test.cpp:(.text 0x1a):未定义对std::cout'thread_test.cpp:

你能帮忙吗?我必须做些什么才能让这段代码在Linux和Windows上运行吗?

共有3个答案

詹弘毅
2023-03-14

了解C编译器如何链接库文件很重要。链接是构建程序的第二步,第一步是需要头文件的编译。

至于链接,链接程序GNU ld完成了这项工作。当您在没有-c的情况下运行gcc或g编译器命令时,将运行ld程序,并自动搜索和链接libc(c标准库)。由于libc中不包含pthread的实现,我们需要明确告诉链接器(gcc/g将标志传递给链接器)搜索pthread库。怎么做?这是gnu在线文档

-唇形的

-l库

链接时搜索名为“库”的库。(将库作为单独参数的第二种替代方法仅用于 POSIX 合规性,不建议这样做。

-l选项由GCC直接传递给链接器。有关确切的详细信息,请参阅您的链接器留档。下面的一般描述适用于GNU链接器。

链接器搜索库的标准目录列表。搜索的目录包括几个标准系统目录以及您用-L指定的任何目录。

静态库是目标文件的存档,其文件名类似于liblibrary.a。一些目标还支持共享库,共享库的名称通常类似于liblibrary.so。如果同时找到静态库和共享库,则链接器会优先选择与共享库链接,除非使用-static选项。

在命令的什么地方写这个选项是有区别的;链接器按照指定的顺序搜索和处理库和目标文件。因此,“foo.o -lz bar.o”在文件foo.o之后bar.o之前搜索库“z”。如果bar.o引用“z”中的函数,则这些函数可能不会被加载。

赞: g thread.cc -lp线程 -o 线程

只需在库名称前加上-l

施玉宸
2023-03-14

对于在2020年阅读本文的任何人:

在GCC中,当链接到p线程时,不要使用“-lp线程”,而只使用“-p线程”CLI选项。

闾丘玺
2023-03-14

使用g代替gcc

 类似资料:
  • 阅读包裹清单。。。多恩 构建依赖树 正在读取状态信息。。。多恩 将安装以下新软件包: docker ce 0升级,1新安装,0移除,0未升级。 需要获取,的存档。 此操作后,将使用的额外磁盘空间。(

  • 我目前正在尝试与我的android应用程序和我的openfire服务器(在ubuntu上工作)握手。但我不能。我没有失败之类的。只是什么都没发生。这感觉很糟糕。

  • ...在Xcode控制台,我得到 它演示了建立了连接并成功找到了服务器,但其他问题出现了。会很感激你的帮助。

  • 我试图创建一个WebSocket servlet上JBOSS与Jetty 8.1.8 这是我的代码:包com.microfocus.entrypoint.servlets; 这里有一个例外: 17:36:01,728 ERROR[org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/benAsync].[Asynch

  • 我正在尝试配置一个Laravel项目,我已经配置了node和bower,没有问题,但在sudo npm安装gulp之后。当我运行gulp时,我得到了这个错误 单元js:341投掷错误^ 错误:找不到模块'laravel-elixir'在函数。模块。_resolveFilename(module.js:339: 15)在函数。模块。_load(module.js:290: 25)在Module.re

  • 有人知道如何解决这个问题吗?不能在R. install.packages("devool")还安装了依赖项'ps','fs','Procexx','xopen','usethis','Call r','git2r','pkgbuild','pkgload','rcmdcheck','roxygen2' null 下载的源程序包位于“/private/var/folders/s2/cptzh4ls2