Почему я должен явно ссылаться на pthreads в моей компиляции main.c, когда мой main.c не использует pthreads? - PullRequest
2 голосов
/ 13 марта 2012

В Linux у меня есть общая библиотека, в которой я использую pthreads, а main.c - нет.

libpthread.so отображается в ldd моей общей библиотеки, и это правильно.

$ ldd libmapreduce.so.1.0 
    linux-gate.so.1 =>  (0x0067d000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x0058c000)
    [...]

Но когда я компилирую и связываю свой main.c, который не использует pthreads, с моей разделяемой библиотекой, я вижу:

$ icc -Wall -o main main.c -lmapreduce
    /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `pthread_atfork'

Добавление -lpthread к моей команде компиляции, т.е.

$ icc -Wall -o main main.c -lmapreduce -lpthread

разрешает неопределенную ссылку.

Почему мне нужно явно ссылаться на libpthread, если мой main.c не использует его, а в моей общей библиотеке уже есть libpthread?

Ответы [ 2 ]

6 голосов
/ 13 марта 2012

Чтобы создать исполняемый файл или DLL, вам нужно связать в транзитивном закрытии все зависимости в вашей программе.Поскольку main.c ссылки в sharedlib, вы также должны ссылаться на все зависимости sharedlib, включая pthreads.

0 голосов
/ 14 марта 2012

Спасибо, Р .. и Паван Манджунатх, за то, что побудили меня продолжать копать.

Шаг ссылки для общей библиотеки libmapreduce.so выглядел следующим образом:

icc -shared -g -o libmapreduce.so.1.0 map.o map_wrp.o -openmp [...] -lpthread -ldl

Этот флаг ссылки -openmp не был необходим и фактически вводил неопределенную ссылку на pthread_atfork.Неопределенная ссылка на pthread_atfork не появлялась, пока я не попытался связать main.c с разделяемой библиотекой libmapreduce.so.Повторное создание libmapreduce.so без флага -openmp устранило проблему.

...