首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将自定义Apache2.4模块与Linux上的httpd/apr库静态链接时出错

问将自定义Apache2.4模块与Linux上的httpd/apr库静态链接时出错
EN

Stack Overflow用户
提问于 2012-05-05 02:36:31
回答 3查看 2K关注 0票数 0

我正在尝试将我的模块迁移到Linux Apache2.4,但我遇到了链接问题。在windows上,可以使用libhttpd.lib以及apr/apr-util库进行链接。lib* httpd、apr和aprutil在我的windows安装中都是静态链接的。我想对Linux安装执行相同的操作。

根据有限的可用文档,我无法使用APXS,因为我的模块是用C++编写的。

我在查找Linux服务器的存档文件时遇到了困难。我需要链接到什么才能使我的模块工作?

源代码能够链接到Windows主机上并在其上执行。

错误示例:

代码语言:javascript
复制
    /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'

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-05 02:42:08

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-05-05 20:58:12

因此,任何其他搜索这个问题的人都可能得到答案。

Apache从apache站点下载任何版本(高于2.2)的源文件到主directory

  • Unpack

  • Configure,或者简单地不指定任何选项(您可以稍后为实际构建重新配置)

  • 对源文件执行make (现在不要做make install!)只需要目标文件)

  • 创建一个目录,该目录将包含您自己模块的库和源代码。在主目录的顶层说"foo“(或任何你执行的主目录: desire)

  • assuming (find ~/httpdX.X -name '*.o‘-exec cp {} ~/foo \;)该命令在括号中。这将把所有编译过的对象复制到foo。

  • 执行(find ~/foo -name ' *.o‘-exec ar r libhttpd.a {} \;),这将为您创建一个代码存档。

  • 然后只需将这些开关包含在您的编译定义中,以便为您的foo目录(-Wl,-Bstatic -lhttpd -lpcre -lpcreposix -lapr-1 -lapr-1 -Wl,-Bdynamic -pthread -ldl lapr-1-Wl,-Bdynamic-pthread-ldl libhttpd.a{}\;)创建一个存档。如果您愿意,只需在*.o文件

上运行rm,即可将这些开关包含在您的foo目录中

您不需要像我那样静态编译,但我希望能够将我的模块迁移到任何Linux主机上,而不必担心必要的组件。Apache需要pcre(regex)、apr(所有库)、线程(proc/thread mutex)、dl(动态加载)和crypt(apr密码)才能工作。因为线程、dl和crypt很可能已经在机器上了,所以我选择不静态编译它们。

祝你打猎愉快。我希望我3天来永不落幕的故事能帮助其他人!

票数 1
EN

Stack Overflow用户

发布于 2012-05-09 10:43:47

对于那些用C++构建Apache模块并想要动态链接的人,这里是我用来成功构建模块的g++命令行;在Apache2.2.22/CentOS6.2上进行了简短的测试。

代码语言:javascript
复制
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支持。

希望这对其他人有帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10454343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档