【问题标题】:linking pthread library issue链接 pthread 库问题
【发布时间】:2011-11-17 03:55:39
【问题描述】:

我面临一个解释和理解可能稍微复杂的问题,因为给出整个图片会太大且太难。

请原谅。

考虑以下 Makefile:

all: clients.so simulator backup
    LD_PRELOAD=/home/Juggler/client/clients.so ./simulator

backup: backup.c libclient.a
    gcc backup.c -o backup -L /home/Juggler/client -L. -lclient -ldl
simulator: simulator.c libclient.a
    gcc -g simulator.c -o simulator -L /home/Juggler/client -L. -lclient -ldl -pthread
libclient.a: libclient.o client.o
    ar rcs libclient.a libclient.o client.o
libclient.o:libclient.c  
    gcc -c libclient.c -o libclient.o -pthread

clients.so: client.o client_invoke.o
    ld -shared -o clients.so client_invoke.o client.o -ldl
client_invoke.o: client_invoke.c
    gcc -Wall -fPIC -DPIC -c -g client_invoke.c
client.o: client.c
    gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread

我们从 libclient.c 调用用 client.c 编写的函数,client.c 中的这些函数调用 pthread_key_create()、pthread_setspecific..等。

线程由simulator.c 创建,这些线程访问其他文件中编写的函数。

在进行 make... 时出现如下错误。

/home/Juggler/client/libclient.a(client.o):In function 'setup_connection':
/home/Juggler/client/client.c:35: undefined reference to 'pthread_setspecific'

pthread.h 已包含在 client.c 和 libclient.c 中

将不胜感激任何指针。我知道信息非常少......

谢谢

【问题讨论】:

    标签: c linux makefile pthreads undefined-reference


    【解决方案1】:

    在 linux 上,pthread 函数存在于 libpthread 库中。所以你必须链接到那个。

    当使用 pthreads 时,正确的方法是使用 -pthread 进行编译和链接,其中将链接到 pthread 库中。您的某些可执行文件有-pthread 标志,但其他可执行文件没有,clients.so 库也没有,所以在需要的地方添加标志。

    另外,请记住,当您创建共享库时,您应该使用 -fPIC 标志编译源文件。

    (而且,您似乎是直接调用ld 来生成client.so 库,您确实应该使用gcc 来进行链接。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多