2012-03-29 11 views
4

뿌리 내린 안드로이드 장치에서 실행할 명령 줄 C++ 테스트 응용 프로그램 (실행 파일)을 만들고 있습니다.정의되지 않은 참조 오류 - rand

실행 파일은 미리 작성된 여러 개의 C 라이브러리를 사용하며 그 중 하나는 'rand()'를 사용합니다. 연결 상태에서 나는 "012"를 얻지 못했습니다. ""rand의 정의되지 않은 참조 "

경로가 제대로 설정되었는지 확인하려면 다음 방법을 시도해보십시오.

첫 번째 접근 방식 : 내 테스트 소스에서 rand()를 정의합니다.

내가하여 여러개의 정의 오류 통지, 첫 번째 정의는 생체 공학에있는/libc의이 /가 포함/stdlib.h

두 번째 방법 : 나는 알

내 테스트 응용 프로그램에서 사용 랜드() 링커는 여기에 정의되지 않은 기호

세 번째 방법에 대해 불평하지 않는 모든 오브젝트 파일 보관되지 및 보관

아직 정의되지 않은 참조 오류가 있음을 알았습니다.

'rand'를 사용하는 C 라이브러리를 C 테스트 파일을 사용하여 실행 파일로 컴파일하면 언급 된 링커 오류가 표시되지 않습니다.

미리 작성된 정적 라이브러리를 수정할 수 없으며 C++ 기반 테스트 응용 프로그램에서 라이브러리를 사용해야합니다.

모든 입력을 환영합니다.

+0

라이브러리에서 'rand'가 'unsigned int rand'대신 'int rand'를 반환 할 것으로 기대하는 것 같습니다. 정적으로 링크되어있는 경우 왜 '해킹'을 사용하고 테스트 C 파일을 컴파일/링크해야합니까? –

+0

rand는 표준 C 모듈이며 공유 객체 또는 실행 파일을 만드는 동안 링크됩니다. 정적 라이브러리는 나에게 제공되며, rand() 호출을 사용하며 정의가 포함되어 있지 않습니다. – Deepak

+0

나는 심볼 덤퍼를 들여다 보길 권한다. 나는 rand()가 무엇인지 알기 때문에 정적 라이브러리가 C 라이브러리가 사용하는 버전과 다른 버전으로 컴파일되었을 가능성이 높습니다. 이것을 여러 가지 방법으로 정리할 수 있습니다 (자신의 랜드를 제공하고 C rand에 래퍼를 제공하는 등).하지만 가장 좋은 방법은 심볼 덤프를 확인하는 것입니다. 또한 http://stackoverflow.com/questions/4768180/rand-implementation으로 안내합니다. –

답변

1

충분하지 않은 점은 {당신이 생체 공학의 stdlib.h를 보면, 당신은

정적 인라인 INT 랜드 (무효)로 정의된다) (즉, 랜드을 볼 수

... 그래서 댓글을 ...}

즉 함수의 실제 코드가 헤더 파일에 있습니다.

첫 번째 방법은 다중 정의 오류를 발생시키는 이유입니다.

두 번째 방법은 동일한 이유로 성공하며 (함수가 인라인 인 것처럼) 개체 파일에 'extern'참조가 생성되지 않으므로 라이브러리가 검색됩니다.

다음. 당신의 C++ 코드는 libc 나 libstdC++에 연결될 것입니다 (당신은 검사 할 필요가 있습니다). 미리 빌드 된 정적 라이브러리는 분명히 rand()의 인라인 구현이없는 stdlib.h에 대해 컴파일되었습니다.

정적 라이브러리에 대해 LDD (또는 readelf) 명령을 수행하고 찾고있는 라이브러리가 플랫폼에 없는지 확인해야합니다. 라이브러리가 rand() 기호를 내보내지 않는 생체 공학적 이름과 동일한 이름을 가질 가능성이 높으므로 로더가 참조를 분석하지 못하고 있습니다.

자, 이것을 고쳐 쓰면 ... 적어도 정적 라이브러리를 재구성 할 수 있습니까? C 테스트 파일이 안드로이드 또는 네이티브 용으로 크로스 컴파일되어 있습니까?

0

사용 'android-ndk32-r10-windows-x86_64.zip'은하지 'android-ndk64-r10-windows-x86_64.zip'

APP_ABI := armeabi armeabi-v7a x86 

3 API는 32 비트입니다.

관련 문제