将自定义Apache 2.4模块静态链接到Linux上的httpd / apr库时出错

时间:2012-05-04 18:36:31

标签: c++ linux apache2 g++ apache-modules

我正在尝试将我的模块移动到Linux Apache 2.4并且我遇到了链接问题。在Windows上,可以链接libhttpd.lib以及apr / apr-util库。 lib * httpd apr和aprutil在我的Windows安装上都是静态链接的。我想为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'

由于

3 个答案:

答案 0 :(得分:1)

这些错误意味着您没有将-pthread添加到编译命令行,因此您没有链接到pthread库。

(注意:它是-pthread,而不是-lpthread - 它不仅仅是一个链接器选项。)

答案 1 :(得分:1)

所以其他任何人都可以找到答案。

  1. 从apache httpd站点下载任何Apache版本(高于2.2)源到主目录
  2. 解压
  3. 配置所有内容或只是指定无选项(您可以 稍后重新配置实际构建)
  4. 在源代码上执行make(暂时不进行make install!只需要对象文件)
  5. 创建一个目录,用于存放您的库和源代码 自己的模块。说" foo"在你家的顶层(或任何你 欲望)
  6. 假设主目录:执行(找到〜/ httpdX.X -name' * .o' -exec cp {}〜/ foo \;)命令在括号中。这会将所有编译的对象复制到foo。
  7. 执行(找到〜/ foo -name' * .o' -exec ar r libhttpd.a {} \;) 将为您创建代码存档。
  8. 然后在gcc的编译定义中包含这些开关 或g ++(-Wl,-Bstatic -lhttpd -lpcre -lpcreposix -lapr-1 -laprutil-1 -Wl,-Bdynamic -pthread -ldl -lcrypt)
  9. 如果您愿意,可以通过在* .o上运行rm来清理您的foo目录 文件
  10. 您不需要像我需要的那样静态编译,但我希望能够将我的模块移动到任何Linux主机而无需担心必要的组件。 Apache需要pcre(regex),apr(所有库),线程(proc / thread mutex),dl(动态加载)和crypt(apr密码)才能工作。由于thread,dl和crypt最喜欢已经在机器上,我选择不静态编译它们。

    快乐狩猎。我希望3天内永无止境的故事可以帮助别人!

答案 2 :(得分:1)

对于那些用C ++构建Apache模块并想要动态链接的人,这里是我用来成功构建模块的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编程菜鸟,无法在其他任何地方找到此信息;感谢OP的解决方案,经过几天的挫折,我才能完成这项工作。

这里还有一个链接,它帮助解释了当找不到httpd服务器核心代码(Windows上的libhttpd.lib)中包含的apache函数时如何解决“未解析的引用”链接器问题 - 这不是存在于* nix中,除非你像OP那样手动制作。基本上,答案是使用-shared标志,以便在运行时自动解析这些引用。 http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

不要忘记模块代码中的'extern C',并在构建HTTPD时构建DSO支持。

希望这有助于其他人!