我正在尝试交叉编译CGAL在 amd64 Linux 机器上迁移到 ARM 架构。 CGAL用途CMake用于建筑。
CGAL 有几个依赖项,包括良好生产规范和MPFR图书馆。当 CMake 运行时,它需要确定这些依赖项的版本。为了查找版本,CMake 编译并运行几个小型测试程序,这些程序只需链接这些库并输出它们的版本。这在常规的、非交叉编译的构建过程中工作得很好。
但是当我交叉编译时,这些测试程序自然不会在宿主机上运行。这是一个例子:
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1
/opt/Company/ArmTools_GCC435_GLIBC_Q3_2011/bin/arm-rc-linux-gnueabi-g++ -fPIC CMakeFiles/cmTryCompileExec.dir/print_GMP_version.cpp.o -o cmTryCompileExec -rdynamic /home/pmw/Software-Engineering/build/Lib/mpir-2.6.0/arm/lib/libgmp.a
gmake[1]: Leaving directory `/home/pmw/Software-Engineering/SW_Tools/CGAL-4.1/CMakeFiles/CMakeTmp'
/home/pmw/Software-Engineering/SW_Tools/CGAL-4.1/CMakeFiles/CMakeTmp/cmTryCompileExec: /home/pmw/Software-Engineering/SW_Tools/CGAL-4.1/CMakeFiles/CMakeTmp/cmTryCompileExec: cannot execute binary file
-- USING GMP_VERSION = 'unknown'
我发现一条建议(如果我理解正确的话)明确指定 GMP 版本;这应该可以防止 CMake 尝试确定它但失败。所以我创建了一个包含这一行的文件:
SET(GMP_VERSION 2.6.0)
并使用参数调用 CMake -C path/to/my/file
。但这并没有改变任何事情。然后我尝试使用参数调用 CMake -DCMAKE_TOOLCHAIN_FILE=/path/to/my/file
。再次,没有效果。不过,我发现 CMake 能够找到并解析该文件。
那么,我怎样才能说服 CMake 不要尝试在主机上构建和执行交叉编译的程序呢?
如果这个 Unix & Linux StackExchange 站点不是解决这个问题的最佳地点,我提前表示歉意。上星期我在 CGAL 邮件列表上发布了我的问题(现在是“交叉编译cgal”的Google结果前三名;我很有名!)但没有收到回复。
答案1
看一下CMake 维基,我相信您需要稍微修改一下CMAKE_CROSSCOMPILING
变量和 CMake 的缓存(所有内容都在 wiki 中进行了描述)。