2012-05-04 1 views
0

Я пытаюсь переместить мой модуль в Linux Apache 2.4, и у меня возникают проблемы с связыванием. В окнах libhttpd.lib доступен для ссылок, а также для библиотек apr/apr-util. lib * httpd apr и aprutil все статически связаны с моей установкой Windows. Я хочу сделать то же самое для установки Linux.Ошибки при связывании настраиваемых модулей Apache 2.4 статически с библиотеками httpd/apr в Linux

Согласно имеющейся ограниченной документации, я не могу использовать APXS, потому что мой модуль написан на C++.

У меня возникли трудности с поиском архивных файлов для сервера в Linux. Что мне нужно, чтобы связать мой модуль для работы?

Источник может ссылаться и выполнять на хосте Windows.

Примеры ошибок:

/home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:367: undefined reference to `pthread_mutexattr_init' 
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:374: undefined reference to `pthread_mutexattr_setpshared' 
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:384: undefined reference to `pthread_mutexattr_setrobust_np' 
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:393: undefined reference to `pthread_mutexattr_setprotocol' 
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:414: undefined reference to `pthread_mutexattr_destroy' 
    /home/ec2-user/httpd-2.4.2/srclib/apr/locks/unix/proc_mutex.c:408: undefined reference to `pthread_mutexattr_destroy' 

Благодарности

ответ

1

Эти ошибки означает, что вы не добавили -pthread в командную строку компиляции, так что вы не получаете pthread библиотеку, связанную с

. (Примечание: это -pthread, а не -lpthread - это не только вариант компоновщика.)

+0

Я включил одну из проблем unixDL, но знаете ли вы, какую библиотеку я буду использовать для исправления этих ошибок? \t '/usr/lib/gcc/i686-amazon-linux/4.4.6/../../../crt1.o: В функции '_start': \t (.text + 0x18): неопределенная ссылка на 'Главный' \t /home/ec2-user/mod_infx_tools.cpp:236: не определено ссылка на '' ap_log_error_ \t /home/ec2-user/lib/libsqlite3.a(sqlite3.o): в функции 'unixDlOpen': \t /home/ec2-user/sqlite-autoconf-3071100/sqlite3.c:30412: undefined ссылка на 'dlopen'' –

+0

Для 'dlopen',' -ldl'. Не знаю о другом, возможно, '-lapr' или' -lapr-util'. – Mat

1

Так anyon Иначе поиск этого может получить ответ.

  1. Скачать любой Apache версии (выше 2,2) источник с сайта апач HTTPd в домашний каталог
  2. Распаковка
  3. Конфигурация со всем или просто не указать никаких опций (Вы можете перенастроить позже фактическое строить)
  4. выполнять грим на источник (не делать сделать установки еще! просто нужно объектные файлы)
  5. создать каталог, который будет содержать ваши библиотеки и источник для собственного модуля . Скажите «foo» на верхнем уровне вашего домашнего каталога (или любого желаемого вам )
  6. Предполагая, что home dir: execute (find ~/httpdX.X -name '* .o' -exec cp {} ~/foo \ ;) Команда находится в скобках. Это скопирует все скомпилированные объекты в foo.
  7. выполнить (найти ~/foo -name '* .o' -exec ar r libhttpd.a {} \;), который создаст для вас архив кода.
  8. Затем просто включить эти переключатели в вашем определении для компиляции GCC или г ++ (-Wl, -Bstatic -lhttpd -lpcre -lpcreposix -lapr-1 -laprutil-1 -Wl, -Bdynamic -pthread -ldl -lcrypt)
  9. очистить ваш каталог Foo если вы хотите, запустив гт на * .o файлов

Вам не нужно компилировать статически, как мне нужно, но я хотел бы быть в состоянии переместить мой модуль любой хост Linux, не беспокоясь о необходимых компонентах. Для работы Apache требуется pcre (regex), apr (все библиотеки), потоки (proc/thread mutex), dl (динамическая загрузка) и crypt (apr password). Поскольку thread, dl и crypt больше всего понравятся уже на машине, я решил не собирать их статически.

Счастливые охоты.Я надеюсь, что моя бесконечная история в течение 3 дней поможет кому-то еще!

1

Для тех, кто строит модули Apache на C++ и хочет динамическую компоновку, вот командная строка g ++, которую я использовал для успешной сборки модуля; кратко протестированы на Apache 2.2.22/CentOS 6.2.

g++ [my files].cpp -I/httpd/include/ -I/httpd/srclib/apr/include/ 
    -I/httpd/srclib/apr-util/include/ -I/usr/include/ -I/usr/include/apr-1/ 
    -I/httpd/os/unix/ -shared -fPIC -o mod_mymodule.so 

Я - программист на Apache/linux noob и не смог найти эту информацию нигде; благодаря решению OP я смог закончить работу после нескольких дней разочарования.

Также приведена ссылка, которая помогла объяснить, как работать с проблемой компоновщика «неразрешенных ссылок», когда она не могла найти функции apache, содержащиеся в главном коде сервера httpd (libhttpd.lib для Windows) t существует в * nix, если вы не сделаете это вручную, как это сделал OP. В основном, ответ заключался в использовании флага -shared, поэтому эти ссылки автоматически решаются во время выполнения. http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

Не забудьте «extern C» в вашем модульном коде и создайте поддержку DSO при создании HTTPD.

Надеюсь, это поможет кому-то еще!

+0

Ницца! Я бы рекомендовал Makefile, чтобы помочь в регенерации. Я собираюсь на платформе Amazon AWS Linux, поэтому ограничен, но определенно поддерживается сценариями оболочки и Makefile. –

+0

@AlexErwin - хороший звонок. Я все еще изучаю материал makefile. Кстати, надеюсь, вы не возражаете, что я полууправляю ваш вопрос, есть недостаток информации о модулях apache C++. Спасибо, что опубликовали ваше решение! – Tom

+0

Очень приветствуется. Я потратил бесчисленные часы на поиск каждого отдельного фрагмента информации, и мне все же нужно было провести пробные и пробные тесты. –

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