使用LLVM加上自定义过程和自定义库编译Apache服务器

使用LLVM加上自定义过程和自定义库编译Apache服务器,apache,compiler-construction,linker,clang,llvm,Apache,Compiler Construction,Linker,Clang,Llvm,我们希望使用LLVM编译Apache2.2.19。在编译过程中,我们希望通过指定CFLAGS环境变量向clang添加一个自定义过程: CFLAGS="-Xclang -load -Xclang mypass.so" 然后,在链接步骤中,我们还希望将可执行文件链接到一个自定义动态库。所以我们导出了这两个环境变量: LDFLAGS="-L. -lmylib" LD_LIBRARY_PATH='./libfolder' 我们在编译MySQL时使用了这些环境变量,并且它按照预期工作。但是,在编译ap

我们希望使用LLVM编译Apache2.2.19。在编译过程中,我们希望通过指定
CFLAGS
环境变量向clang添加一个自定义过程:

CFLAGS="-Xclang -load -Xclang mypass.so"
然后,在链接步骤中,我们还希望将可执行文件链接到一个自定义动态库。所以我们导出了这两个环境变量:

LDFLAGS="-L. -lmylib"
LD_LIBRARY_PATH='./libfolder'
我们在编译MySQL时使用了这些环境变量,并且它按照预期工作。但是,在编译apache时,我们遇到了以下错误:

/usr/bin/ld: cannot find -load
链接器似乎还读取编译器标志,然后将
-load
解释为库。。。你能告诉我怎样才能解决这个问题吗

详情如下:

下面是我用来配置apache的命令:

CC=clang CXX=clang++
CFLAGS="-Xclang -load -Xclang /home/my/software/llvm-build/Debug+Asserts/lib/mypass.so" 
CXXFLAGS="-Xclang -load -Xclang /home/my/software/llvm-build/Debug+Asserts/lib/mypass.so"
LDFLAGS="-ldl -L/home/my/Projects/lib/ -lmylib"
LD_LIBRARY_PATH="/home/my/Projects/lib/"
./configure
运行make后出现的错误如下:

/bin/bash /home/my/Downloads/httpd-2.2.19/srclib/apr/libtool --silent --mode=link
clang -Xclang -load -Xclang /home/my/software/llvm-build/Debug+Asserts/lib/mypass.so 
-DHAVE_CONFIG_H -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE
-I./include -I/home/my/Downloads/httpd-2.2.19/srclib/apr/include/arch/unix
-I./include/arch/unix -I/home/my/Downloads/httpd-2.2.19/srclib/apr/include/arch/unix
-I/home/my/Downloads/httpd-2.2.19/srclib/apr/include  -version-info 4:5:4   --verbose -ldl
-L/home/my/Projects/lib/ -lmylib-o libapr-1.la
-rpath /usr/local/apache2/lib passwd/apr_getpass.lo strings/apr_cpystrn.lo
strings/apr_fnmatch.lo strings/apr_snprintf.lo strings/apr_strings.lo
strings/apr_strnatcmp.lo strings/apr_strtok.lo tables/apr_hash.lo
tables/apr_tables.lo atomic/unix/builtins.lo atomic/unix/ia32.lo
atomic/unix/mutex.lo atomic/unix/ppc.lo atomic/unix/s390.lo
atomic/unix/solaris.lo dso/unix/dso.lo file_io/unix/buffer.lo
file_io/unix/copy.lo file_io/unix/dir.lo file_io/unix/fileacc.lo file_io/unix/filedup.lo
file_io/unix/filepath.lo file_io/unix/filepath_util.lo file_io/unix/filestat.lo
file_io/unix/flock.lo file_io/unix/fullrw.lo file_io/unix/mktemp.lo file_io/unix/open.lo
file_io/unix/pipe.lo file_io/unix/readwrite.lo file_io/unix/seek.lo
file_io/unix/tempdir.lo locks/unix/global_mutex.lo locks/unix/proc_mutex.lo
locks/unix/thread_cond.lo locks/unix/thread_mutex.lo locks/unix/thread_rwlock.lo
memory/unix/apr_pools.lo misc/unix/charset.lo misc/unix/env.lo misc/unix/errorcodes.lo
misc/unix/getopt.lo misc/unix/otherchild.lo misc/unix/rand.lo misc/unix/start.lo
misc/unix/version.lo mmap/unix/common.lo mmap/unix/mmap.lo network_io/unix/inet_ntop.lo
network_io/unix/inet_pton.lo network_io/unix/multicast.lo network_io/unix/sendrecv.lo
network_io/unix/sockaddr.lo network_io/unix/socket_util.lo network_io/unix/sockets.lo
network_io/unix/sockopt.lo poll/unix/epoll.lo poll/unix/kqueue.lo poll/unix/poll.lo
poll/unix/pollcb.lo poll/unix/pollset.lo poll/unix/port.lo poll/unix/select.lo
random/unix/apr_random.lo random/unix/sha2.lo random/unix/sha2_glue.lo shmem/unix/shm.lo
support/unix/waitio.lo threadproc/unix/proc.lo threadproc/unix/procsup.lo
threadproc/unix/signals.lo threadproc/unix/thread.lo threadproc/unix/threadpriv.lo
time/unix/time.lo time/unix/timestr.lo user/unix/groupinfo.lo user/unix/userinfo.lo
-luuid -lrt -lcrypt  -lpthread

/usr/bin/ld: cannot find -load
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [libapr-1.la] Error 1
make[3]: Leaving directory `/home/my/Downloads/httpd-2.2.19/srclib/apr'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/my/Downloads/httpd-2.2.19/srclib/apr'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/my/Downloads/httpd-2.2.19/srclib'
make: *** [all-recursive] Error 1

我想出了一个解决办法,尽管我不能100%确定根本原因

apache的配置文件似乎会在链接时将编译器标志和链接器标志放在一起。所以我们能做的就是在configure中找到所有链接相关的语句。例如,我们在根目录中使用以下命令:

grep -r '\--mode=link' .
然后我们转到每个配置文件并删除$(编译)

您可能还会遇到标签问题,可以通过以下方式解决:


此外,由于我们正在链接一个动态库,因此需要在运行make之前导出正确的LD_library_路径。

您能发布编译器运行的完整命令吗?完成。谢谢你的建议。