модуль модуля apxs apache компилирует библиотеки в общий объект linux / unix - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь создать новый модуль Apache 2, чтобы содержать сложную часть программного обеспечения. Код состоит из моих собственных файлов C, которые компилируются в файлы .o и затем связываются в файл .so. Проблема в том, что мой код использует tcl для обработки сценариев. До настоящего времени я скомпилировал tcl (версия 8.4.13 - да, это старая версия) в архив .a и связал его с файлами .o, чтобы создать один файл .so, который Apache загружается как модуль и все работает. Я обнаружил, что это сложно в системе BS * Ma c, но, наконец, смог заставить ее работать: 1. Компилировать tcl с опциями --enable-threads --disable-shared --disable-corefoundation 2. Связать Файлы .o из моего кода в библиотеку tcl:

g cc -DSHARED_MODULE -bundle -undefined suppress -flat_namespace -o mod_anastasia.so Release / *. o libtcl8.5.a

Это работает для BSD / Ma c. Теперь мне нужно скомпилировать этот модуль для сервера Linux. Вот команда apxs, которая должна (теоретически) работать:

apxs -i - c mod_anastasia. c ana_browsegrove. c libtcl8.4.a

Это выдает следующее предупреждение:

* Предупреждение: связывание общей библиотеки mod_anastasia.la с библиотекой stati c libtcl8.4.a не переносимо! *

И, конечно же, когда я пытаюсь загрузить файл .so, созданный в Apache, я получаю эту ошибку:

httpd: Синтаксическая ошибка в строке 156 /usr/local/apache2/conf/httpd.conf: невозможно загрузить модули / mod_anastasia.so на сервер: /usr/local/apache2/modules/mod_anastasia.so: неопределенный символ: acos

Итак мой вопрос ... кто-нибудь знает формулу magi c для компиляции файла .a, так что Apache может связать его с файлами .o, созданными apxs?

1 Ответ

1 голос
/ 12 марта 2020

acos() является функцией libm. Вы должны указать, что вашей общей библиотеке также должна быть ссылка libm, чтобы удовлетворить ее требованиям.

Попробуйте скомпилировать так:

apxs -i -c mod_anastasia.c ana_browsegrove.c libtcl8.4.a -lm

Это должно исправить ваш неопределенный символ проблема.

Для другого предупреждения: вместо этого вы можете попробовать связать общую версию библиотеки tcl, заменив libtcl8.4.a на -ltcl8.4 (если соответствующая библиотека tcl установлена ​​правильно в система). Связывание библиотек stati c с общей библиотекой может быть проблематичным c, и его следует избегать.

...