2012-05-04 2 views
0

모듈을 Linux Apache 2.4로 이동하려고하는데 링크 문제가 있습니다. 창에서 libhttpd.lib는 apr/apr-util 라이브러리뿐만 아니라 링크 할 수 있습니다. lib * httpd apr과 aprutil은 모두 내 Windows 설치시 정적으로 링크됩니다. 리눅스 설치에서도 똑같이하고 싶습니다.Linux에서 httpd/apr 라이브러리를 사용하여 사용자 정의 Apache 2.4 모듈을 정적으로 링크 할 때의 오류

제공되는 제한된 설명서에 따르면 모듈이 C++로 작성되었으므로 APXS를 사용할 수 없습니다.

Linux에서 서버의 보관 파일을 찾는 데 어려움이 있습니다. 내 모듈이 작동하려면 무엇을 연결해야합니까?

소스는 Windows 호스트에서 링크되어 실행될 수 있습니다.

샘플 오류 :

/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' 

감사

답변

1

이러한 오류 당신이 링크 된 pthread 라이브러리를 받고하지 않는, 그래서 당신이 당신의 컴파일 명령 줄에 -pthread를 추가하지 않았 음을 의미합니다

. (참고 : -pthread이 아니라 -lpthread이 아닙니다. 단지 링커 옵션이 아닙니다.

+0

unixDL 문제 중 하나만 포함되었지만 이러한 오류를 해결하는 데 사용할 라이브러리를 알고 있습니까? \t'/usr/lib/gcc/i686-amazon-linux/4.4.6/../../../crt1.o : 함수 '_start'에서 : \t (.text + 0x18) : 정의되지 않은 참조 'main' \t /home/ec2-user/mod_infx_tools.cpp:236 : 'ap_log_error_'에 대한 정의되지 않은 참조 \t /home/ec2-user/lib/libsqlite3.a(sqlite3.o) : 함수 'unixDlOpen'에서 : \t /home/ec2-user/sqlite-autoconf-3071100/sqlite3.c:30412 : 'dlopen'에 대한 정의되지 않은 참조 –

+0

'dlopen'의 경우, -ldl'. 다른 하나, 아마도'-lapr' 또는'-lapr-util'에 대해서는 모른다. – Mat

1

그래서 anyon 이것에 대한 다른 검색 답변을 얻을 수 있습니다. 홈 디렉토리에 아파치 사이트에서

  1. 다운로드 어떤 아파치 버전 (이상 2.2) 소스
  2. 의 포장을 풀고
  3. 구성 모든 또는 단순히 (어떤 옵션을 지정 할 수 있습니다 재구성 나중에 실제에 대한
  4. 소스에 메이크업을 수행) 구축 (
  5. 은 자신의 모듈에 대한 당신의 라이브러리와 소스를 보유 할 디렉토리를 생성) 단지 오브젝트 파일이 필요합니다! 메이크업 설치하지 아직 없습니다. 홈 디렉토리의 최상위 레벨에서 "foo"라고 말하십시오. 욕망
  6. 가정 디렉토리를 가정합니다 : execute (/ ~ httpdX.X -name '* .o'-exec cp {} ~/foo \ ;) 명령은 괄호 안에 있습니다. 그러면 컴파일 된 모든 객체가 foo에 복사됩니다.
  7. 이 코드의 아카이브를 생성 할 실행 (~ ~ foo -name '* .o'-exec ar r libhttpd.a {} \;)을 실행하십시오.
  8. 가 그럼 그냥 GCC 또는 g ++에 대한 귀하의 컴파일 정의에서 이러한 스위치를 포함 (-Wl, -Bstatic -lhttpd -lpcre -lpcreposix -lapr-1 -laprutil-1 -Wl, -Bdynamic -pthread -ldl -lcrypt)
  9. 정리하여 foo는 디렉토리는 * .o 인 파일에 RM을 실행하여 좋아하는 경우에

당신은 내가 필요 같은 정적으로 컴파일 할 필요가 없습니다,하지만 난에 내 모듈을 이동 할 수 있기를 원 모든 Linux 호스트는 필요한 구성 요소에 대해 걱정할 필요가 없습니다. 아파치는 pcre (정규식), apr (모든 라이브러리), 스레드 (proc/thread 뮤텍스), dl (동적로드) 및 crypt (apr 암호)가 필요합니다. thread, dl, crypt는 이미 머신 상에 있기 때문에 정적으로 컴파일하지 않기로 결정했습니다.

해피 헌팅.내 3 일 동안 끝없는 이야기가 다른 사람을 돕기를 바랍니다!

1

아파치 모듈을 C++로 작성하고 동적 연결을 원한다면 모듈을 성공적으로 빌드하는 데 사용한 g ++ 명령 줄을 다음과 같이 사용하십시오. Apache 2.2.22/CentOS 6.2에서 간단히 테스트되었습니다.

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)에 포함 된 아파치 기능을 찾을 수 없을 때 '해결되지 않은 참조'링커 문제를 해결하는 방법을 설명하는 링크입니다. * nix에는 OP와 같이 수동으로 만들지 않는 한 존재하지 않습니다. 기본적으로 대답은 -shared 플래그를 사용하여 런타임에 이러한 참조가 자동으로 해결되기 때문입니다. http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

모듈 코드에서 'extern C'를 잊어 버리지 말고, HTTPD를 작성할 때 DSO 지원에서 빌드하십시오.

희망이 있으면 다른 사람에게 도움이됩니다.

+0

니스! 재생성을 돕기 위해 Makefile을 추천합니다. Amazon AWS Linux 플랫폼에서 컴파일 중이므로 제한적이지만 쉘 스크립트와 Makefile을 통해 확실히 지원됩니다. –

+0

@AlexErwin - 전화하세요. 나는 아직도 makefile 물건을 배우고있다. BTW, 당신의 질문을 반 납치하는 것에 신경 쓰지 않기를 바랍니다. 거기에는 정보가 부족합니다. C++ apache 모듈에 관한 것입니다. 솔루션을 게시 해 주셔서 감사합니다! – Tom

+0

매우 환영합니다. 모든 정보 비트를 검색하는 데 수많은 시간을 보냈고 시행 및 오류 테스트를 수행해야했습니다. –