如何静态链接libmvec?

时间:2015-08-31 08:44:22

标签: c++ linux static-linking

我正在尝试构建一个自包含的可执行文件,我可以在任何/大多数Linux主机上运行。

我知道我可以用容器做到这一点,但是现在我试图静态链接我的exe。

我编译:

g++ -std=c++1y -fopenmp -Ofast -g -march=x86-64 -mtune=generic -m64 -c <source>.cpp -MMD -MP -o <object>.o

并链接:

g++ -std=c++1y -fopenmp -Ofast -g -march=x86-64 -mtune=generic -m64 <list of object files> <list of absolute path to static libs .a> -lpthread -static-libgcc -static-libstdc++ -o exe

它过去工作得很好,但我刚发现它现在在某些主机上打破

error while loading shared libraries: libmvec.so.1: cannot open shared object file: No such file or directory

我不知道代码或系统库是否更新了。我试过(无济于事):

  • 删除-fopenmp
  • -lmvec -lm添加到链接器

我的exe确实是静态关联的:ldd exenot a dynamic executable。但它坚持在运行时加载libmvec.sostrace exe说:

  • execv
  • 一堆mmap
  • 打开(ld-linux-x86-64.so),阅读并关闭它
  • 打开(ld.so.cache),stat,mmap,然后关闭它
  • open(libpthread.so),read,stat,mmap并关闭它
  • open(libmvec.so)=&gt; 在不存在的主机上失败
  • [...]

据我所知,libmvec是libm的扩展,处理由OpenMP使用的x86向量化。

基本上,我在问是否有办法让它静态工作 - 我看到至少有3个解决方案:

  • 禁用它 - 但这可能意味着性能损失,即使我禁用OpenMP
  • 也会使用它
  • 静态链接它,并以某种方式向运行时解释它不必动态链接到它,因为它已经链接。
  • 使其成为可选项,即如果它不可用则动态选择较慢的代码路径。这听起来很复杂但理论上可能是可能的。

0 个答案:

没有答案