programing

크로스 컴파일 시 외부 라이브러리를 사용하는 방법은 무엇입니까?

powerit 2023. 7. 22. 10:28
반응형

크로스 컴파일 시 외부 라이브러리를 사용하는 방법은 무엇입니까?

x86 unbuntu machine에서 라즈베리 파이 ARM 타겟을 위한 코드를 작성하고 있습니다.저는 gcc-linaro-armhf 툴체인을 사용하고 있습니다.저는 파이에서 몇 가지 독립적인 프로그램을 교차 컴파일하고 실행할 수 있습니다.이제, 나는 내 코드를 nurs와 같은 외부 라이브러리와 연결하고 싶습니다.어떻게 하면 이것을 이룰 수 있을까요?

프로그램을 호스트 시스템의 기존 ncurses lib에 연결한 다음 ARM에서 실행해야 합니까? (이것은 작동하지 않을 것 같습니다) lib for arm의 소스 또는 사전 빌드 버전을 가져와 lib 경로에 넣은 다음 컴파일해야 합니까?

이런 상황에서 가장 좋은 방법은 무엇입니까?

cstdlib에 대해서도 어떻게 작동하는지 알고 싶습니다.제 프로그램에서는 stdio 기능을 사용했는데 특별한 작업 없이 크로스 컴파일 후 작동했습니다.방금 makefile에 제 armgcc 경로를 제공했습니다.그래서, 어떻게 그것이 정확한 std 헤더와 립을 얻었는지 알고 싶습니다.

일반적인 질문과 관련하여:

C 라이브러리가 작동하는 이유:

C 라이브러리는 크로스 툴 체인의 일부입니다.이 때문에 헤더가 발견되고 프로그램이 올바르게 연결되어 실행됩니다.libm 및 libstdc++와 같은 다른 매우 기본적인 시스템 라이브러리에서도 마찬가지입니다(모든 경우 툴체인 구성에 따라 달라지는 것은 아닙니다).

일반적으로 교차 개발을 다룰 때는 원하는 라이브러리를 교차 컴파일할 수 있는 방법이 필요합니다.이 경우 바이너리를 사용하는 경우는 매우 드뭅니다.즉, 특히 ARM 하드웨어의 경우 매우 다양한 구성이 존재하고 종종 모든 구성이 다양한 방식으로 제거되기 때문입니다.그렇기 때문에 바이너리는 서로 다른 장치와 Linux 구성 간에 바이너리 호환성이 높지 않습니다.

만약 당신이 라즈베리 파이에서 Ubuntu를 실행하고 있다면, 인터넷이나 심지어 일부 Ubuntu apt 저장소에서 적절한 ncurs 라이브러리를 찾을 가능성이 있습니다.그러나 일반적인 방법은 라이브러리를 가지고 있는 특정 도구 체인과 교차 컴파일하는 것입니다.

많은 복잡한 라이브러리를 교차 컴파일해야 하는 경우 buildroot 또는 ptxdist와 같이 삶을 좀 더 쉽게 만드는 솔루션이 있습니다.이러한 프로그램은 임베디드 장치를 위한 완전한 Linux 커널 및 루트 파일 시스템을 구축합니다.

그러나 당신의 경우, 당신이 오직 curs만 원한다면 당신은 소스 코드를 직접 컴파일할 수 있습니다.소스를 다운로드하고 실행하면 됩니다.configure를 사용하여 툴체인을 지정하는 동안--host옵션. 그.--prefix옵션을 선택하면 설치 디렉토리가 선택됩니다.실행 후make그리고.make install모든 것이 정상적으로 진행되었다는 것을 고려하면, 당신은 당신의 응용 프로그램이 링크할 헤더 세트와 ARM 컴파일 라이브러리를 갖게 될 것입니다.

교차 컴파일과 관련하여 인터넷에서 많은 정보를 찾을 수 있을 것이고 아마도 curses는 출하된 문서에 몇 가지 포인터를 가지고 있을 것입니다.

조회용How the C library works in cross-tools

구성 중에 교차 도구 체인을 컴파일하고 구축할 때 sysroot를 제공합니다.

맘에 들다--with-sysroot=${CLFS_CROSS_TOOLS}

--with-sysroot --with-sysroot=dir

Tells GCC to consider dir as the root of a tree that contains (a subset of) the root filesystem of the target operating system. Target system headers, libraries and run-time object files will be searched for in there. More specifically, this acts as if --sysroot=dir was added to the default options of the built compiler. The specified directory is not copied into the install tree, unlike the options --with-headers and --with-libs that this option obsoletes. The default value, in case --with-sysroot is not given an argument, is ${gcc_tooldir}/sys-root. If the specified directory is a subdirectory of ${exec_prefix}, then it will be found relative to the GCC binaries if the installation tree is moved.

그래서 보는 대신에/lib /usr/include컴파일할 때 /Toolchain/(libc) 및 (파일 포함)을 찾습니다.

확인할 수 있습니다.

arm-linux-gnueabihf-gcc -print-sysroot

이 쇼는 libc를 어디서 찾아야 하는지 보여줍니다.

또한.

arm-linux-gnueabihf-gcc -print-search-dirs

당신에게 선명한 그림을 줍니다.

분명히, 당신은 필요할 것입니다.ncurses목표로 하는 ARM을 위해 컴파일되었습니다. 호스트에 있는 ARM은 전혀 도움이 되지 않습니다(호스트에 ARM 프로세서가 없는 한). 하지만 x86은 그렇지 않습니다.

미리 구축된 라이브러리를 사용할 수도 있지만, 소스에서 직접 라이브러리를 구축하는 것보다 (사용자의 특정 조건에 맞는) 라이브러리를 찾는 것이 더 많은 작업이라고 생각합니다. 그렇게 어렵지는 않을 것입니다.ncurses구축하는 데 그렇게 많은 시간이 걸리지 않습니다.

첫 번째 질문과 관련하여 크로스 컴파일러 도구 체인에서 ncurs 라이브러리를 사용하려면 팔로 만든 이진 파일을 준비해야 합니다.

두 번째 질문은 std libs에서 어떻게 작동하는지입니다. 툴체인이 프로그램을 컴파일/링크하기 위해 사용하는 시스템 libc/lib이 아닙니다.컴파일러의 --print-file-name= 옵션에서 볼 수 있습니다.

arm-none-linux-gnuabi-gcc --print-file-name=libm.a

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libm.a

arm-none-linux-gnuabi-gcc --print-file-name=libpthread.so

...(my working folder)/arm-2011.03(arm-toolchain folder)/bin/../arm-none-linux-gnuabi/libc/usr/lib/libpthread.so

나는 당신의 라즈베리 툴체인이 같을 것이라고 생각합니다.이거 한번 해보세요.

Vinay의 대답은 꽤 확실합니다.라즈베리 파이에 대한 ncurses 라이브러리를 컴파일할 때 수정하는 것입니다. 당신의 rootfs를 설정하는 옵션은 다음과 같습니다.--sysroot=<dir>그리고 아닌--with-sysroot이것이 제가 다음 컴파일러를 사용할 때 발견한 것입니다.

arm-linux-gnueabihf-gcc --versionarm-linux-gnueabihf-gcc (크로스툴-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) 4.8.3 20140303 (사전 출시)
Copyright (C) 2013 Free Software Foundation, Inc.
이것은 자유 소프트웨어입니다. 복사 조건은 원본을 참조하십시오.거기에는 없다보증; 심지어 상품성이나 특정 목적에 대한 적합성에 대해서도.

언급URL : https://stackoverflow.com/questions/18900855/how-to-work-with-external-libraries-when-cross-compiling

반응형