使用 cmake 在 GNU GuixSD 中编译程序

使用 cmake 在 GNU GuixSD 中编译程序

我正在尝试编译Xash3D在 GuixSD v1.0.0 和 gcc 8.3.0 上。

如下所示,ld(GNU Linker)给我错误,ctr1.o 和 ctri.o 丢失。这些文件存在于 /gnu/store/{specicProgramName} 内多个目录下的其他位置,但是,令人惊讶的是,我无法建立到其他库所在的 ~/.guix_profile 的符号链接,即使具有 root 访问权限也是如此。它们有多个版本,大小不同,因此我假设它们仅与各自的程序兼容。此外。 ~/.guix_profile 似乎模拟了 Unix 系统的根目录,但是在 GuixSD 中,根目录和 ~/.guix_profile 都缺少 /usr,所以我不知道在哪里链接 c 对象,即使我有实际文件。

本质上,ld找不到 crt1.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”的库,而该库可以解决 Debian 中的问题。也许有一个替代包包含这个库和其他库?

我正在寻找一个不涉及使用 Wine 的解决方案。单独解决 libgcc 问题可能还不够,所以为了找到真正的解决方案,我将尝试评论中留下的任何建议(对我来说没有危险,操作系统安装在 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 包库中的某个位置,但名称不同。

我尝试在 shell 中绑定 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 文件创建符号链接将摆脱编译错误。但请注意,在编译过程中您很可能需要重做几次。

希望这可以帮助。

PS如果我处于你的情况,我会问自己:我真的需要这个testCCompiler吗?

相关内容