我有一个可以在本地机器编译的程序,需要在远程服务器上运行,并且不允许在远程服务器上编译。
现在这些本地机器的CPU都有AVX512仪表组,但远程服务器没有。一般来说,我们可以使用
-march=x86-86, -march=core-avx2, -mo-avx512f
等来尝试禁用avx512仪器,但是有一个问题是,本地机的glibc版本比远程高,所以我需要静态编译程序。如果没有,程序将转储到远程服务器,因为glibc的版本不低(并且不允许在远程服务器上更新glibc,遗憾的是),但是当我用-static
编译时,我会发现该程序有AVX512工具。 (我找到AVX512的方法是使用一个名为elfx86exts的工具来检查程序有什么仪器)。
有没有一些方法可以编译一个能够在远程服务器上运行的程序?
很抱歉我的英文不太好,如果有什么没表达清楚的地方请问我。谢谢大家。
我尝试了一些编译选项组合。
1,2,3在avx512测试的ci上会失败,4没有avx512,但会有glibc版本冲突。
但是有一个问题是,本地机器的glibc版本比远程高,所以我需要静态编译程序。
这个问题的解决办法是不静态链接;它是针对 libc
的目标版本链接到
property(例如,通过在 docker 容器内构建,或者将编译器指向备用
libc
安装)。
与普遍的看法相反,静态链接的二进制文件在移动到不同的机器时几乎永远不会(正确)工作。