Вопрос по linker, linux, gcc – Принудительно установить GCC на статическую связь, например, pthreads (а не динамическая ссылка)

6

Моя программа построена как загрузчик и много модулей, которые являются общими библиотеками. Теперь одна из этих библиотек использует pthreads, и кажется, что она динамически связана с модулем (загружается при запуске). Теперь было бы проще, если бы я мог принудительно связать pthreads с файлом модуля. GCC на Linux, как мне это сделать? Я предполагаю, что libpthread.a необходим ....

В каком случае вам нужно делать что-то кроме включения заголовка pthread, чтобы его собрать? У вас есть пример источника? Является ли этот метод составления абсолютной необходимостью? Adam Miller

Ваш Ответ

1   ответ
18

При ссылкеlibpthread.a в общую библиотеку теоретически возможно, этоreally bad idea, Причина в том, чтоlibpthread это частьglibc, а такжеall частиglibc must точно совпадают, иначе вы увидите странные и необъяснимые сбои.

Так что связываниеlibpthread.a в вашу общую библиотеку:

  1. Cause your program to crash when moved to a machine with a different version of glibc
  2. Cause your existing program to crash when your current machine's glibc is upgraded, but your module is not re-linked against updated libpthread.a.

Избавь себя от обострения и не делай этого.

Благодарю. Понравился ответ. Хотя запрос - если libpthread является частью libc / glibc, почему он предоставляется в виде отдельной библиотеки. Почти все библиотеки ссылаются на libc, а затем, что тогда было нужно libpthread
Сожалею. Я не был достаточно понятен с моим запросом. Из вашего ответа я понял, что libpthread - это подмножество glibc / libc. Это означает, что любая программа, которая ссылается на libc / glibc, может использовать многопоточностьwith out ссылка на libpthread. Сказав "libpthread является частью glibc" - похоже, если libpthread равен A, то libc равен A + X. Таким образом, накладные расходы на pthread накладываются на все программы, ссылающиеся на libc. Я чувствую, что мое понимание вашего ответа неверно. Но не уверен, где я не прав.
: о боже мой, боже мой, хорошо, что вы утверждаете это. Но когда его часть glibc, ... / меня сумасшедший .. imacake
@Kiran Ты не прав в этомlibc != GLIBC. GLIBC (пакет) содержитlibc, libpthread, librt, libcrypt, libresolv (отдельные файлы) и многое другое. Не каждая программа ссылается на все это.
@Kiran & quot; Почему это предусмотрено как отдельная библиотека & quot; - потому что многим программам не нужны потоки, а ссылки вlibpthread накладывает ненужные накладные расходы на такие программы.

Похожие вопросы