5 dynamic-linking cmake guix ld guixsd
我正在尝试在 GuixSD v1.0.0 和 gcc 8.3.0 上编译Xash3D。
如下所示,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
Run Code Online (Sandbox Code Playgroud)
-- 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
Run Code Online (Sandbox Code Playgroud)
与 Debian 非常相似,Guix 有一个用于软件包安装的 bash 命令:“guix install $PACKAGE”,但是它的约 10,000 个库不包含名为“gcc-multilib”的库,而该库可以解决 Debian 中的问题。也许有一个替代包包含这个库和其他库?
我正在寻找一个不涉及使用 Wine 的解决方案。单独解决 libgcc 问题可能还不够,所以为了找到真正的解决方案,我将尝试评论中留下的任何建议(对我来说没有危险,操作系统安装在 USB 密钥上的隔离环境中) )。
这是我的$PATH
样子:
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
Run Code Online (Sandbox Code Playgroud)
在基于 Debian 的操作系统中,应安装的两个软件包名为 和gcc-multilib
。libc-dev
这些包(或其元素)应该存在于 Guix 包库中的某个位置,但名称不同。
我尝试在 shell 中绑定 LIBRARY_PATH 的各种路径,包括:
-- 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
Run Code Online (Sandbox Code Playgroud)
Vin*_*ard -1
每次编译新的 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吗?