apache
  • compiler-construction
  • linker
  • clang
  • llvm
  • 2014-02-17 54 views 4 likes 
    4

    我們想使用LLVM編譯apache 2.2.19。在編譯過程中,我們要添加自定義通通過指定CFLAGS環境變量鐺:使用LLVM Plus自定義密碼和自定義庫編譯Apache服務器

    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 
    

    的錯誤後,我跑做是在這裏:

    /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 
    
    +1

    你能發佈編譯器運行的完整命令嗎? – Yang

    +0

    完成。感謝您的建議。 – ZillGate

    回答

    1

    我想出了一個解決方案,雖然我不是100%確定的根本原因。

    看來,Apache的配置文件將鏈接時將編譯器標誌和鏈接器標誌放在一起。所以我們可以做的是在配置中查找所有與鏈接相關的語句。例如,我們在根目錄使用以下命令:

    grep -r '\--mode=link' . 
    

    然後我們去的每個配置文件,並刪除$(編譯)

    您可能還遇到標籤問題,您可以在此得到解決way: https://forums.gentoo.org/viewtopic-t-915572-start-0.html

    此外,由於我們正在鏈接一個動態庫,因此我們需要在運行make之前導出正確的LD_LIBRARY_PATH。

    相關問題