как скрыть динамическую ссылку на статическую ссылку

У меня есть программа, использующая библиотеку libevent.

при компиляции программы команда компиляции выглядит так:

 gcc -o myprogram mysource.c mysource.h -levent 

так что это динамическая ссылка.

теперь я хочу запустить эту программу на компьютере, где нет libevent, мне нужно статическое связывание, чтобы мою программу можно было запустить на этом компьютере, есть ли какие-нибудь простые шаги?

Я попробовал -static, но получил следующую ошибку:

    [root@kitty relay]# gcc  -o relay -static mysource.c mysource.h -levent -lpcap
    /usr/bin/ld: cannot find -lpcap
    /usr/bin/ld: cannot find -lc
    collect2: ld returned 1 exit status

Зачем?


person misteryes    schedule 14.06.2013    source источник


Ответы (2)


У вас должно быть libevent.a. Тогда вы можете просто gcc -o myprogram mysource.c libevent.a.

Или попробуйте gcc -o myprogram -static mysource.c -levent.

(И вам, вероятно, не следует указывать mysource.h для gcc, поскольку он, скорее всего, включен в mysource.c с #include "mysource.h".)

person nullptr    schedule 14.06.2013
comment
если у меня есть несколько общих библиотек, таких как -lpcap, -levent, и я хочу только статически связать libevent, но динамически связать libpcap, возможно ли это или нет? Спасибо! - person misteryes; 14.06.2013
comment
Тогда не указывайте опцию -static, а передайте компоновщику libevent.a (как в первой команде) и добавьте -lpcap. - person nullptr; 14.06.2013
comment
Я попробовал gcc -o relay -static mysource.c mysource.h /usr/local/lib/libevent.a -lpcap, но получил ошибки: вроде /home/wgong/Downloads/package/libevent-1.4.14b-stable/event.c:150: undefined reference to clock_gettime. Зачем? - person misteryes; 14.06.2013
comment
спасибо, с -lrt все в порядке, не могли бы вы немного рассказать о -lrt? Спасибо! - person misteryes; 14.06.2013
comment
Он говорит компоновщику использовать библиотеку librt. Что ж, я предполагаю, что libevent.so динамически связывается с librt.so (его функции используют функции из librt), и это обрабатывается загрузчиком, когда мы динамически связываем libevent. Но когда мы связываем libevent статически, нам нужно разрешить все вызовы из libevent во время компоновки. - person nullptr; 14.06.2013

Из документации GCC. :

-static

В системах, поддерживающих динамическое связывание, это предотвращает связывание с общими библиотеками. В других системах эта опция не действует.

person Carl Norum    schedule 14.06.2013