크로스 컴파일 시 테스트 프로그램을 실행할 수 없습니다 - 크로스 컴파일 Firebird

크로스 컴파일 시 테스트 프로그램을 실행할 수 없습니다 - 크로스 컴파일 Firebird

크로스 컴파일러를 사용하여 arm Linux용 Firebird 서버를 컴파일해 보았습니다(선택되었으므로 정상적으로 작동했습니다).

그것을 사용할 때:

./autogen.sh --host=arm-linux-gnu

다음 오류가 발생합니다.

sem_init()가 작동하는지 확인하세요... 구성: 오류: '/compile/code/firebird/trunk': 구성: 오류: 크로스 컴파일 시 테스트 프로그램을 실행할 수 없습니다.

나는 크로스 컴파일을 하고 있다는 것을 알고 있지만 Firebird 개발자는 이에 동의하지 않을 수도 있습니다(그러나 Firebird가 다른 아키텍처용으로 컴파일할 준비가 되어 있다는 것을 읽었습니다).

답변1

구성은 프로그램을 컴파일하고 실행하여 특정 질문에 대한 답을 결정합니다.비행 중...(일반적으로) 빌드 호스트가 대상 호스트와 동일할 때 이 작업을 수행할 수 있습니다.

크로스 컴파일할 때 (일반적으로) 빌드 시스템은 크로스 컴파일러에서 생성된 바이너리를 실행할 수 없습니다.

이 문제를 극복하려면 구성 스크립트에서 테스트 위치를 찾으세요. 운이 좋으면 구성 스크립트에서 테스트 결과를 캐시할 수 있습니다... 이를 사용하면 구성 스크립트가 이미 알고 있다고 생각하도록 속일 수 있습니다. 문제에 대한 대답이므로 바이너리를 컴파일하고 실행하려고 시도하지 않습니다.

예를 들어, openldap 2.3.11(내가 아는 이전 버전)을 크로스 컴파일하려는 경우 환경에 변수를 전달해야 할 수도 있습니다 ac_cv_func_memcmp_working=yes(또는 명령줄에서 이 설정을 사용하여 구성을 호출할 수 있다고 생각합니다. 예를 들어 ./configure ac_cv_func_memcmp_working=yes --prefix=...). .

구성 스크립트의 코드는 다음과 같습니다(이전 버전의 autoconf이므로 최신 구성 스크립트에서는 코드가 다르지만 개념은 변경되지 않았습니다)...

echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6
if test "${ac_cv_func_memcmp_working+set}" = set; then
  echo $ECHO_N "(cached) $ECHO_C" >&6
else
  if test "$cross_compiling" = yes; then
    ac_cv_func_memcmp_working=no
  else
...

위의 코드에서 구성 스크립트가 크로스 컴파일 중이라고 생각하면 대상 시스템에 대해 (내 경우에는 잘못된) 가정을 한다는 것을 알 수 있습니다.

이 트릭(답변 캐싱)을 사용하여 문제를 해결할 수 없는 경우 다른 방법으로 해결 방법을 제공해야 합니다... 목표는 구성 스크립트가 전혀 실행되도록 속이는 것입니다.

관련 정보