c-apxs apache模块创建者将库编译到共享对象linux/unix中



我正在尝试创建一个新的Apache2模块,以容纳一个复杂的软件。代码由我自己的C文件组成,这些文件编译成.o文件,然后链接到.so文件中。问题是我的代码使用tcl来处理脚本。到目前为止,我已经将tcl(版本8.4.13——是的,它就这么旧了(编译到.a档案中,并将其链接到.o文件以创建一个.so文件,Apache将其作为模块加载,一切正常。我在基于Mac BSD的系统上发现了这一点,但最终通过以下方式使其发挥作用:1.使用--enable threads--disable shared--disable corefoundation选项编译tcl2.使用以下内容将我的代码中的.o文件链接到tcl库:

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

这适用于BSD/Mac。所以现在我需要为Linux服务器编译这个模块。以下是apxs命令,它(理论上(应该起作用:

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

这会发出以下警告:

*警告:针对静态库libtcl8.4.a不可移植*

当我试图将创建的.so文件加载到Apache中时,我会得到以下错误:

httpd:/usr/local/apache2/conf/httpd.conf第156行语法错误:无法将模块/mod_anastasia.so加载到服务器:/usr/local/acche2/modules/mod_atastastasia.so:未定义的符号:acos

所以我的问题。。。有人知道编译.a文件以便Apache将其链接到apxs制作的.o文件的神奇公式吗?

acos()libm的函数。您必须指定,您的共享库还需要链接libm以满足其要求。

尝试以这种方式编译:

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

这应该可以解决未定义符号的问题。

对于另一个警告:您也可以尝试将libtcl8.4.a替换为-ltcl8.4来链接tcl库的共享版本(如果系统中正确安装了相应的tcl库(。将静态库链接到共享库可能会有问题,应该避免。

相关内容

  • 没有找到相关文章