cmake를 사용하여 GNU GuixSD에서 프로그램 컴파일

cmake를 사용하여 GNU GuixSD에서 프로그램 컴파일

컴파일하려고하는데Xash3DGuixSD v1.0.0 및 gcc 8.3.0에서.

아래와 같이 ld(GNU Linker)는 ctr1.o와 ctri.o가 누락되었다는 오류를 표시합니다. 이러한 파일은 /gnu/store/{specicProgramName} 내의 여러 디렉터리에 있는 다른 위치에 존재하지만 놀랍게도 루트 액세스도 이와 같더라도 다른 라이브러리가 있는 ~/.guix_profile에 대한 심볼릭 링크를 만들 수 없습니다. 다양한 크기의 여러 버전이 있으므로 해당 프로그램과만 호환된다고 가정합니다. 또한. ~/.guix_profile은 Unix 시스템의 루트를 에뮬레이트하는 것처럼 보이지만 GuixSD에서는 루트와 ~/.guix_profile 모두 /usr이 누락되어 있으므로 실제 개체가 있더라도 c 개체를 어디에 링크해야 할지 모르겠습니다. 파일.

기본적으로 ldcrt1.o, crti.o 및 libgcc_s.so는 찾을 수 없으며 이전과 마찬가지로 이러한 2개의 c 개체와 libgcc를 연결하거나 설치한 후 cmake는 추가 오류 종속성에 대한 다른 오류와 함께 중지됩니다.

아무튼 다음 명령어를 통해 인쇄/기록되는 내용입니다. (Xash3D 설치시 권장되는 방법입니다.)

sudo cmake -DHL_SDK_DIR=../hlsdk -DXASH_SDL=yes -DXASH_VGUI=yes -DCMAKE_C_FLAGS="-m32" -DCMAKE_CXX_FLAGS="-m32" -DCMAKE_EXE_LINKER_FLAGS="-m32" ../ && sudo make
-- The C compiler identification is GNU 9.1.0
-- The CXX compiler identification is GNU 9.1.0
-- Check for working C compiler: /home/nick/.guix-profile/bin/gcc
-- Check for working C compiler: /home/nick/.guix-profile/bin/gcc -- broken
CMake Error at /gnu/store/nrsbv2df55abwji1gsb1ilf22n3rc1xa-cmake-3.13.1/share/cmake-3.13/Modules/CMakeTestCCompiler.cmake:52 (message):
  The C compiler

    "/home/nick/.guix-profile/bin/gcc"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /home/nick/xash3d/build/CMakeFiles/CMakeTmp
    Run Build Command:"/home/nick/.guix-profile/bin/make" "cmTC_7635d/fast"
    /home/nick/.guix-profile/bin/make -f CMakeFiles/cmTC_7635d.dir/build.make CMakeFiles/cmTC_7635d.dir/build
    make[1]: Entering directory '/home/nick/xash3d/build/CMakeFiles/CMakeTmp'
    Building C object CMakeFiles/cmTC_7635d.dir/testCCompiler.c.o
    /home/nick/.guix-profile/bin/gcc   -m32    -o CMakeFiles/cmTC_7635d.dir/testCCompiler.c.o   -c /home/nick/xash3d/build/CMakeFiles/CMakeTmp/testCCompiler.c
    Linking C executable cmTC_7635d
    /gnu/store/nrsbv2df55abwji1gsb1ilf22n3rc1xa-cmake-3.13.1/bin/cmake -E cmake_link_script CMakeFiles/cmTC_7635d.dir/link.txt --verbose=1
    /home/nick/.guix-profile/bin/gcc -m32     -rdynamic CMakeFiles/cmTC_7635d.dir/testCCompiler.c.o  -o cmTC_7635d 
    /home/nick/.guix-profile/bin/ld: cannot find crt1.o: No such file or directory
    /home/nick/.guix-profile/bin/ld: cannot find crti.o: No such file or directory
    /home/nick/.guix-profile/bin/ld: skipping incompatible /gnu/store/69x60a1pn0mf5jv68al8awjfkyp1miwi-gcc-8.3.0-lib/lib/gcc/x86_64-unknown-linux-gnu/8.3.0/libgcc.a when searching for -lgcc
    /home/nick/.guix-profile/bin/ld: cannot find -lgcc
    /home/nick/.guix-profile/bin/ld: skipping incompatible /gnu/store/69x60a1pn0mf5jv68al8awjfkyp1miwi-gcc-8.3.0-lib/lib/gcc/x86_64-unknown-linux-gnu/8.3.0/../../../libgcc_s.so.1 when searching for libgcc_s.so.1
    /home/nick/.guix-profile/bin/ld: cannot find libgcc_s.so.1
    /home/nick/.guix-profile/bin/ld: skipping incompatible /gnu/store/69x60a1pn0mf5jv68al8awjfkyp1miwi-gcc-8.3.0-lib/lib/gcc/x86_64-unknown-linux-gnu/8.3.0/libgcc.a when searching for -lgcc
    /home/nick/.guix-profile/bin/ld: cannot find -lgcc
    collect2: error: ld returned 1 exit status
    make[1]: *** [CMakeFiles/cmTC_7635d.dir/build.make:87: cmTC_7635d] Error 1
    make[1]: Leaving directory '/home/nick/xash3d/build/CMakeFiles/CMakeTmp'
    make: *** [Makefile:121: cmTC_7635d/fast] Error 2

Debian과 마찬가지로 Guix에는 패키지 설치를 위한 bash 명령인 "guix install $PACKAGE"가 있지만 약 10,000개의 라이브러리에는 데비안의 문제를 해결하는 "gcc-multilib"라는 라이브러리가 포함되어 있지 않습니다. 어쩌면 이 라이브러리와 다른 라이브러리를 포함하는 대체 패키지가 있을까요?

Wine을 사용하지 않는 솔루션을 찾고 있습니다. libgcc 문제만 해결하는 것만으로는 충분하지 않을 수 있으므로 실제 해결 방법을 찾기 위해 주석에 남겨진 제안을 시도해 보겠습니다. (나에게는 위험하지 않습니다. OS는 USB 키의 격리된 환경에 설치됩니다.)

$PATH모습은 다음과 같습니다.

/gnu/store/hk4f641r18vpj44m42pny6rp1nwg3d4w-glib-2.56.3-bin/bin
/run/setuid-programs
/home/nick/.config/guix/current/bin
/home/nick/.guix-profile/bin
/home/nick/.guix-profile/sbin
/run/current-system/profile/bin
/run/current-system/profile/sbin

Debian 기반 운영 체제에서 설치해야 하는 두 패키지의 이름은 gcc-multilib및 입니다. libc-dev이러한 패키지(또는 그 요소)는 Guix 패키지 라이브러리 어딘가에 있어야 하지만 다른 이름으로 존재해야 합니다.

다음을 포함하여 셸의 다양한 경로에 LIBRARY_PATH를 바인딩해 보았습니다.

$HOME/.guix-profile/lib
$HOME/.guix-profile/lib/gcc/x86_64-unknown-linux-gnu/4.8.2
## Containing many c object/shared object and header files
/gnu/store/aqv6njg05w2yqh8krgrjy0wcbfxb4nn3-gcc-toolchain-9.1.0/lib/crt1.o
## Containing crt1.o and crti.o

답변1

패키지를 작성합니다. 이는 대략적인 개요이며 개선이 필요합니다.

(define-module (gnu packages xash3d)
  #:use-module (guix packages)
  #:use-module (guix git-download)
  #:use-module (guix utils)
  #:use-module (guix build-system cmake)
  #:use-module ((guix licenses) #:select (gpl3))
  #:use-module (gnu packages))

(define-public xash3d
  (package
    (name "xash3d")
    (version "0.19.2")
    (let (commit (string-append "v" version))
          (revision "1")) 
    (source (origin
              (method git-fetch)
              (uri (git-reference
                   (url (string-append "https://github.com/FWGS/" name "/"))
                   (commit commit)))))
    (build-system cmake-build-system)
    (synopsis "Xash3D FWGS Engine.")
    (description "Xash3D Engine is a custom Gold Source engine rewritten from scratch.")
    (home-page "https://xash.su/")
    (license gpl3)))

자원:https://www.gnu.org/software/guix/manual/en/html_node/Defining-Packages.html

답변2

gcc-toolchain아래 그림과 같이 패키지를 설치하십시오.설명서에 설명되어 있어요.

답변3

새로운 GNU 컴파일 프레임워크(크로스 또는 네이티브)를 컴파일할 때마다 이 crt*.o 오류가 발생합니다.

crt[1,i,n].o는 하위 수준 연결에 사용되는 C 런타임 파일입니다. ld 및 Collect2는 각 개별 컴파일에 이를 사용합니다. 문제는 컴파일러 자체에 매우 가까운 것을 컴파일하려고 할 때 발생합니다. 로그(testCCompiler.co 구축)를 보면 이 작업을 시도하고 있는 것으로 보입니다.

이 문제를 완전히 해결하기 위한 독특하고 우아한 방법을 찾으려는 노력은 결국 실패했지만 항상 오류를 극복했습니다. 나는 당신이 GNU Make 컴파일 프로세스(특히 오류 디버깅)를 이해하고 있다고 가정합니다. CMake는 GNU Make의 구성 래퍼일 뿐입니다. 다음은 귀하에게 도움이 될 수 있는 몇 가지 유용한 단서입니다.

  • 컴파일을 시작하기 전에 crt*.o 파일의 경로를 결정하십시오. 이는 오류 해결에 매우 중요합니다.

  • 컴파일하는 동안 임시 컴파일러인 xgcc는 -B "디렉토리" 경로 검색 옵션을 사용합니다(gcc 매뉴얼 페이지 참조). crt 파일 경로를 수동으로 추가하여 사용하세요.

  • 오류 출력을 기반으로 crt 파일에 대한 심볼릭 링크를 생성하면 컴파일 오류가 제거됩니다. 그러나 컴파일 프로세스 중에 이 작업을 여러 번 다시 실행해야 할 가능성이 높다는 점에 유의하세요.

도움이 되었기를 바랍니다.

추신: 제가 당신의 상황에 처해 있다면 스스로에게 묻겠습니다. 이 testCCompiler가 정말 필요한가요?

관련 정보