2012-03-10 7 views
2

Я хочу внести некоторые изменения в библиотеку pthread, используемую для моей программы. Вот почему я хочу связать свою собственную модифицированную библиотеку pthread. Я могу взять исходный код в glibc за pthread, изменить его и использовать для моих программ.Как я могу связать свою собственную библиотеку pthread

Обычно вы используете флаг -pthread для связи с оригинальной библиотекой pthread. Как указать в моем файле makefile ссылку на мою собственную библиотеку.

+2

см. Http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling – Christoph

ответ

2

-pthread эквивалентен -lpthread -D_REENTRANT с gcc/glibc. Вы можете сделать то же самое, но с другим аргументом ссылки (-lname-of-library).

+1

Вы можете подтвердить, что это верно в вашей конкретной версии gcc. Использовать 'gcc -dumpspecs | grep "% {pthread". –

+0

получается, что вам действительно не нужно '-D_REENTRANT', то есть просто' -lame-of-library' должно быть достаточно – Christoph

4

Просто используйте параметр -L, чтобы указать каталог, в котором находится ваша пользовательская библиотека, и используйте параметр -l, чтобы указать имя вашей библиотеки. Для Ex:

-L/root/x/mylib -lmypthread 

В этом случае ваше Lib имя должно libmypthread.so

Обратитесь к http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html для более подробной информации.

Для того, чтобы библиотека найдена для загрузки при выполнении вашей программы, сделать

export LD_LIBRARY_PATH = $(LD_LIBRARY_PATH):/root/x/mylib 
+1

Вместо этого вы можете передать опцию '-rpath' в компоновщик:' -Wl, -rpath $ MYLIB_DIR', если у меня есть синтаксис правильно. –

0

Скомпилировать библиотеку под другим именем, например, libmypthread.so и поместить его в одном из каталогов, содержащихся в вашем LD_LIBRARY_PATH (или добавить новый каталог). Теперь вы можете использовать -lmypthread для связи с вашей библиотекой.

2

Не использовать -pthread. Это недокументированный вариант GCC, возможно, совместимый с некоторыми другими (Solaris?) Компиляторами.

Определение -D_REENTRANT, которое оно -pthread, полностью исключает возможность использования glibc; ни один из заголовков не зависит от этого макроса для безопасности потоков. (Последний из таких механизмов был удален из заголовков glibc в 1998 году!) Простое связывание в -lpthread достаточно для переключения функций glibc в безопасный поток, и -lpthread может быть заменен вашей собственной библиотекой, как и в другом ответе.

+0

см. Http://gcc.gnu.org/ml/gcc/2010-05/msg00062.html – Christoph

+0

К сожалению, хотя это должно быть *, это может быть неверно для gcc. Теоретически, gcc предположительно использует несовместимую с POSIX модель памяти, в которой он может выполнять оптимизации, которые неправильно переносят обращения через синхронизацию, и вам нужно использовать '-pthread' или' -std = c11', чтобы использовать правильную модель памяти. Я никогда не сталкивался с ситуацией, когда это имеет значение, но я помню, как читал поток в одном списке рассылки или в gcc-трекере, где это было отношением разработчиков gcc, и возможно, это связано с реальной ошибкой ... –

+0

О, я помню вопрос сейчас. Он получает доступ к памяти как к более крупному типу, и это влияет на битовые поля. gcc игнорирует объявленный целочисленный тип в битовом поле и часто выполняет циклы чтения/изменения/записи с гораздо большей (например, 64-разрядной) операцией загрузки/хранения, что может быть чрезвычайно опасно, если данные, которые находятся рядом с битовым полем в памяти к которому обращается другой поток (или даже обработчик сигнала).Предположительно, '-pthread' отключает поведение, и теперь для него может быть отдельный параметр -f. Интересно, что это было ядро ​​Linux *. –

Смежные вопросы