在arm64 Linux系统上编译tdoku-lib的问题和解决

拉取存储库并checkout

复制代码
git clone --no-checkout https://github.com/hackerzhuli/tdoku-lib.git

root@66d4e20ec1d7:/par/tdoku-lib# git checkout     
Your branch is up to date with 'origin/master'.
root@66d4e20ec1d7:/par/tdoku-lib# ls
BUILD.sh  CMakeLists.txt  LICENSE  README.md  data.zip	example  include  src  test

问题1.缺少cmake程序

复制代码
root@66d4e20ec1d7:/par/tdoku-lib# ./BUILD.sh
./BUILD.sh: line 14: cmake: command not found
make: *** No targets specified and no makefile found.  Stop.

到CMake官方网站下载编译好的arm64 Linux二进制文件最方便。

然后解压缩,并把可执行文件目录添加到PATH环境变量中。

复制代码
wget https://github.com/Kitware/CMake/releases/download/v4.2.1/cmake-4.2.1-linux-aarch64.tar.gz

Length: 59512006 (57M) [application/octet-stream]
Saving to: 'cmake-4.2.1-linux-aarch64.tar.gz'

cmake-4.2.1-linux-aarch64.tar.gz                100%[=====================================================================================================>]  56.75M  10.6MB/s    in 4.5s    

2026-01-14 07:54:12 (12.7 MB/s) - 'cmake-4.2.1-linux-aarch64.tar.gz' saved [59512006/59512006]

mkdir cmake
cd cmake
root@66d4e20ec1d7:/par/cmake# tar xf ../cmake-4.2.1-linux-aarch64.tar.gz

root@66d4e20ec1d7:/par/cmake/cmake-4.2.1-linux-aarch64/bin# export PATH=$PATH:/par/cmake/cmake-4.2.1-linux-aarch64/bin
root@66d4e20ec1d7:/par/cmake/cmake-4.2.1-linux-aarch64/bin# cmake --version
cmake version 4.2.1

CMake suite maintained and supported by Kitware (kitware.com/cmake).

问题2. 缺少immintrin.h头文件。

复制代码
root@66d4e20ec1d7:/par/tdoku-lib# ./BUILD.sh all

-- Build files have been written to: /par/tdoku-lib/build
[  6%] Building CXX object CMakeFiles/tdoku_object.dir/src/solver_dpll_triad_simd.cc.o
In file included from /par/tdoku-lib/src/solver_dpll_triad_simd.cc:2:
/par/tdoku-lib/src/simd_vectors.h:5:10: fatal error: immintrin.h: No such file or directory
    5 | #include <immintrin.h>
      |          ^~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/tdoku_object.dir/build.make:79: CMakeFiles/tdoku_object.dir/src/solver_dpll_triad_simd.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:102: CMakeFiles/tdoku_object.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

这是因为immintrin.h 头文件用于包含高级向量指令集扩展(such as SIMD, Single Instruction Multiple Data)相关的指令。具体来说,它支持多种Intel的向量指令集扩展,包括SSE、AVX、AVX2、AVX-512等。该头文件提供了一系列用于向量化编程的内在函数(intrinsics),这些函数允许程序员直接使用 处理器的向量指令,而不需要编写汇编代码。

arm64架构没有sse指令集,自然也没有相应头文件。按照网上的提示,下载了将 Intel SSE 指令转换为 ARM NEON 指令的头文件sse2neon.h,保存到源代码所在目录。

复制代码
https://github.com/DLTcollab/sse2neon/blob/master/sse2neon.h

将上述simd_vectors.h文件中的#include <immintrin.h>替换成#include "./sse2neon.h"

还在CMakeLists.txt中添加了如下一行

复制代码
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+fp+simd+crypto+crc")

问题3.编译solver_dpll_triad_scc.cc出错

同样需要在solver_dpll_triad_scc.cc文件中添加一行#include <cstdint>,然后就可以编译通过了。

root@66d4e20ec1d7:/par/tdoku-lib# ./BUILD.sh

CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):

Compatibility with CMake < 3.10 will be removed from a future version of

CMake.

Update the VERSION argument value. Or, use the ... syntax

to tell CMake that the project requires at least but has been updated

to work with policies introduced by or earlier.

-- The C compiler identification is GNU 14.2.0

-- The CXX compiler identification is GNU 14.2.0

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working C compiler: /usr/bin/cc - skipped

-- Detecting C compile features

-- Detecting C compile features - done

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Check for working CXX compiler: /usr/local/bin/c++ - skipped

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- Configuring done (1.1s)

-- Generating done (0.0s)

-- Build files have been written to: /par/tdoku-lib/build

6%\] Building CXX object CMakeFiles/tdoku_object.dir/src/solver_dpll_triad_simd.cc.o \[ 12%\] Building CXX object CMakeFiles/tdoku_object.dir/src/solver_basic.cc.o \[ 18%\] Building CXX object CMakeFiles/tdoku_object.dir/src/solver_dpll_triad_scc.cc.o \[ 25%\] Building CXX object CMakeFiles/tdoku_object.dir/src/util.cc.o \[ 31%\] Building CXX object CMakeFiles/tdoku_object.dir/src/generate.cc.o \[ 37%\] Building CXX object CMakeFiles/tdoku_object.dir/src/solve.cc.o \[ 37%\] Built target tdoku_object \[ 43%\] Linking CXX static library libtdoku_static.a \[ 43%\] Built target tdoku_static \[ 50%\] Linking CXX shared library libtdoku_shared.so \[ 50%\] Built target tdoku_shared \[ 56%\] Building CXX object CMakeFiles/run_tests.dir/test/run_tests.cc.o \[ 62%\] Building CXX object CMakeFiles/run_tests.dir/src/util.cc.o \[ 68%\] Building CXX object CMakeFiles/run_tests.dir/src/solver_dpll_triad_simd.cc.o \[ 75%\] Linking CXX executable run_tests \[ 75%\] Built target run_tests \[ 81%\] Building CXX object CMakeFiles/grid_lib.dir/src/grid_lib.cc.o \[ 87%\] Linking CXX static library libgrid_lib.a \[ 87%\] Built target grid_lib \[ 93%\] Building CXX object CMakeFiles/grid_tools.dir/src/grid_tools.cc.o \[100%\] Linking CXX executable grid_tools \[100%\] Built target grid_tools 性能测试 效果完全一样,但是没有amd的版本快, 和dlx程序差不多,大概是sse2neon 的损耗。 root@66d4e20ec1d7:/par/tdoku-lib# gcc example/solve.c build/libtdoku_static.a -O3 -o solve -lstdc++ -lm root@66d4e20ec1d7:/par/tdoku-lib# unzip data.zip Archive: data.zip creating: data/ inflating: data/puzzles0_kaggle inflating: data/puzzles1_unbiased inflating: data/puzzles2_17_clue inflating: data/puzzles3_magictour_top1465 inflating: data/puzzles4_forum_hardest_1905 inflating: data/puzzles5_forum_hardest_1905_11+ inflating: data/puzzles6_forum_hardest_1106 inflating: data/puzzles7_serg_benchmark inflating: data/puzzles8_gen_puzzles root@66d4e20ec1d7:/par/tdoku-lib# time ./solve < data/puzzles2_17_clue >17result.txt real 0m2.663s user 0m2.632s sys 0m0.020s root@66d4e20ec1d7:/par/tdoku-lib# root@66d4e20ec1d7:/par/tdoku-lib# cd /par/1224/0114 root@66d4e20ec1d7:/par/1224/0114# gcc dlx_line.cpp -O3 -o dlxline root@66d4e20ec1d7:/par/1224/0114# time ./dlxline < sudoku17.txt > 17result2.txt real 0m2.803s user 0m2.692s sys 0m0.092s

相关推荐
楼兰公子12 分钟前
读取rpi摄像头
linux·服务器·算法
李景琰17 分钟前
Debian12安装配置Mqtt之EMQX
linux·运维·服务器
SimLine芯见17 分钟前
专为空管环境打造的KVM切换器,满足主备自动化高速无缝切换需求
运维·自动化
测试员周周19 分钟前
【AI测试系统】第1篇:LangGraph 实战:用 State Graph 搭建 AI测试流水线(4 步编排 + RAG 增强 + 完整代码)
linux·windows·python·功能测试·microsoft·单元测试·多轮对话
不做无法实现的梦~25 分钟前
PX4 机载电脑 Linux 环境安装、串口、网络、ROS 完整配置
linux·运维·网络
嵌入式×边缘AI:打怪升级日志25 分钟前
嵌入式Linux开发(了解交叉编译工具链的组成)
java·linux·运维
IT界的老黄牛28 分钟前
停电后 Redis 集群两节点起不来:fix 完还报 Bad file format?多部分 AOF 修复的正确姿势
运维·redis·缓存
接着奏乐接着舞30 分钟前
3D Tiles tileset.jso 数据格式
运维·服务器·3d
李小白2020020231 分钟前
RK3568 linux6.1 死机
linux·运维·服务器
FreeGo~34 分钟前
Linux 系统编程 进程篇 (五)
java·linux·服务器