我正在尝试创建一个新的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库(。将静态库链接到共享库可能会有问题,应该避免。