尽管存在 libgomp.1.dylib,但库无法找到它

问题描述

我正在尝试在我的 M1 MacBook 上构建 OpenSfM。我通过 MacPorts 安装了 GCC11、Ceres 和 OpenCV。我需要手动将 /opt/local/lib 添加到 OpenSfM 的 CMakeLists.txt 中,因为 setuptools 不知何故没有找到 ceres.h,但之后编译 OpenSfM 工作正常。

当我后来运行一个使用 OpenSfM 的程序时,它失败了:

Traceback (most recent call last):
  File "/Users/pvitt/projects/odm/./run.py",line 19,in <module>
    from stages.odm_app import ODMApp
  File "/Users/pvitt/projects/odm/stages/odm_app.py",line 10,in <module>
    from stages.run_opensfm import ODMOpenSfMStage
  File "/Users/pvitt/projects/odm/stages/run_opensfm.py",line 14,in <module>
    from opendm.osfm import OSFMContext
  File "/Users/pvitt/projects/odm/opendm/osfm.py",in <module>
    from opensfm.large import Metadataset
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/opensfm-0.5.2-py3.9.egg/opensfm/large/Metadataset.py",line 7,in <module>
    from opensfm import io
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/opensfm-0.5.2-py3.9.egg/opensfm/io.py",line 11,in <module>
    from opensfm import context,features,geo,pygeometry,pymap,types
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/opensfm-0.5.2-py3.9.egg/opensfm/features.py",line 9,pyfeatures
ImportError: dlopen(/opt/local/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/opensfm-0.5.2-py3.9.egg/opensfm/pyfeatures.cpython-39-darwin.so,2): Library not loaded: @rpath/libgomp.1.dylib
  Referenced from: /opt/local/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/opensfm-0.5.2-py3.9.egg/opensfm/pyfeatures.cpython-39-darwin.so
  Reason: image not found

查看 /opt/local/lib/ 表明我有一个 libgomp.1.dylib

% ls -al /opt/local/lib/gcc11/libgomp.1.dylib
lrwxr-xr-x  1 root  admin  37 May 16 00:57 /opt/local/lib/gcc11/libgomp.1.dylib -> /opt/local/lib/libgcc/libgomp.1.dylib
% ls -al /opt/local/lib/libgcc/libgomp.1.dylib
-rwxr-xr-x  1 root  admin  245120 May 16 00:24 /opt/local/lib/libgcc/libgomp.1.dylib

[编辑] 由于我的 cpu 架构是 ARM,因此我还需要为此架构构建工具和库,它们是什么:

% file `which gcc`
/opt/local/bin/gcc: Mach-O 64-bit executable arm64
% file /opt/local/lib/opencv4/libopencv_core.4.5.2.dylib
/opt/local/lib/opencv4/libopencv_core.4.5.2.dylib: Mach-O 64-bit dynamically linked shared library arm64
% file /opt/local/lib/gcc11/libgomp.1.dylib
/opt/local/lib/gcc11/libgomp.1.dylib: Mach-O 64-bit dynamically linked shared library arm64

[/编辑]

所以我想知道错误来自哪里。我在编译过程中做错了吗?我怎样才能找到这个错误的原因?由于我还必须手动将 /opt/local/lib 添加CMakeLists.txt 文件中,因此我怀疑此路径以某种方式未正确发布。但是,为什么 cmake 不使用 MacPorts 放置所有内容文件夹?我必须手动发布吗?通过CPATH/LIBRARY_PATH?为什么我可以只使用 OpenMP:

% cat test_omp.c
#include <stdio.h>
#include <omp.h>

void main() {
    #pragma omp parallel
    {
        printf("Hello World... from thread = %d\n",omp_get_thread_num());
    }
}
% gcc -fopenmp test_omp.c
% ./a.out
Hello World... from thread = 1
Hello World... from thread = 3
Hello World... from thread = 2
Hello World... from thread = 5
Hello World... from thread = 4
Hello World... from thread = 6
Hello World... from thread = 0
Hello World... from thread = 7

我担心这真的很愚蠢,但我只是没有看到。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)