【问题标题】:Can't link Intel Math Kernel Library to Xcode because there is no Intel_MKL.framework folder无法将英特尔数学核心函数库链接到 Xcode,因为没有 Intel_MKL.framework 文件夹
【发布时间】:2011-10-18 15:23:03
【问题描述】:

我正在尝试在运行 Mac OSX 10.6.6 和 Xcode 3.2.6 的 64 位 Mac 上使用 Intel Math Kernel Library (MKL)。对于 Mac,英特尔 MKL 只能通过安装完整的 Intel Composer XE 2011 C++ 编译器来使用。我已经这样做了,我运行了 bash 脚本

/Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/bin/intel64/mklvars_intel64.sh
/Developer/opt/intel/composer_xe_2011_sp1.6.038/link_install.sh

为 Composer XE 和 MKL 设置环境变量。我可以使用编译器在 Xcode 中构建简单的测试项目。

但是,我无法使用 MKL,因为我无法在 Xcode as described here 中链接它。我没有该超链接中描述的 MKL 框架文件夹

/Library/Frameworks/Intel_MKL.framework/

(具体来说,我的系统上的任何地方都没有标题为 Intel_MKL.framework 的文件夹。)英特尔的几本 MKL 参考手册中都提到了检查以确保该文件夹存在,但它们没有告诉你如果发生这种情况该怎么办它不存在!如果您已正确安装 MKL,似乎假定它存在,但我有(“Composer XE 安装成功”)并且没有 Intel_MKL.framework。

如果重要的话,我得到的错误是

"_dsyevx", referenced from:
jEigenvalues(TNT::Array2D<double>&, TNT::Array1D<double>&)in main.o 
ld: symbol(s) not found
collect2: ld returned 1 exit status

据我了解与未正确链接一致。

我花了很多时间和精力试图寻求帮助,包括英特尔论坛,但无济于事。我怀疑这是一个简单的问题(我只是一个业余爱好者)。

非常感谢您的帮助。


编辑:

根据 Paul 的建议,我重新运行了安装程序,没有任何变化。唯一的 mkl.h 文件位于

/Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/include 

以及非Xcode安装目录中预期的相同副本

/opt/intel/composer_xe_2011_sp1.6.038/mkl/include

我不知道这是否是我应该在 Xcode 的“标题搜索路径”下列出的内容,但我很久以前就列出了。我也列出来了

/Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/lib 

作为“库搜索路径”,我根据阅读此2011 guide 的最佳尝试添加了这些链接器标志:

-libmkl_intel_lp64.a 
-libmkl_core.a 
-libmkl_sequential.a 
-libmkl_intel_thread.a

什么都没有改变,我得到同样的错误:

ld returned 1 exit status

他的问题是动态链接还是静态链接?我选择了静态链接(.a 结尾而不是 .dylib),因为它看起来更简单,但我不知道。更改为动态没有任何作用。

这里有什么可以得到反馈的吗?基于此错误,我不知道要更改什么。


EDIT2:

我刚刚在 Xcode“项目信息”(可能是 100 个选项之一)中找到了一个我不知道存在的选项“使用英特尔数学内核库”。 (我应该在哪里找到这个?)现在事情正在构建,但是当我运行可执行文件时,我得到了

exit;
dyld: Library not loaded: libmkl_intel_lp64.dylib
  Referenced from: /Users/.../nameofexecutable
  Reason: image not found
Trace/BPT trap
logout

我已经仔细检查了库搜索目录是否正确。我还尝试切换以 .a 结尾的静态库,但错误完全相同。 (仍然有 .dylib 结尾。)这是否意味着我被动态困住了?为什么?我还定义了变量

DYLD_LIBRARY_PATH

成为

/Developer/opt/intel/composer_xe_2011_sp1.6.038/compiler/lib: /Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/lib

正如old instructions here 中的建议,但没有任何改变。

哇,这太难了。

【问题讨论】:

    标签: xcode linker osx-snow-leopard intel intel-mkl


    【解决方案1】:

    重要编辑

    至少在我“从 XCODE”运行可执行文件时,在此编辑下写入的内容有效。当我找到它所在的目录并在那里双击它时,我会收到以下消息:

    Last login: Sun Nov 24 17:05:19 on ttys002
    MacBook-Pro-de-totouser:~ totouser$ /Users/totouser/Library/Developer/Xcode/DerivedData/THECONSOLEAPPLICATION-hknajgycvjjcotdtkeeyxbzmtfty/Build/Products/Debug/THECONSOLEAPPLICATION ; exit;
    dyld: Library not loaded: libmkl_sequential.dylib
      Referenced from: /Users/totouser/Library/Developer/Xcode/DerivedData/THECONSOLEAPPLICATION-hknajgycvjjcotdtkeeyxbzmtfty/Build/Products/Debug/THECONSOLEAPPLICATION
      Reason: image not found
    Trace/BPT trap: 5
    logout
    

    [处理完成]

    如果有人可以帮忙,那就太好了,因为我真的被困在这里

    /////////////////////////////////////// ///////////////////////////////////////// ////////////////////////////

    好的,我成功地做了你想做的事:

    我已经在我使用 XCode 5.0.2 的 mac os 10.8.5 64bits 下安装了 m_ccompxe_2013_sp1.1.103。

    首先要引用项目中的mkl include目录。在做之前,我想强调的是,即使做了之后,我也永远无法在 c++ 代码中写出这样的东西

    #include "mkl.h"
    

    我不得不将完整路径放入 mkl.h 文件,这有点无聊,因为我希望理想地这样放置:

    #include <mkl>
    #include <mkl_vsl.h>
    #include <mkl_vsl_functions.h>
    

    等等。所以我在我的mac上找到了“iostream”文件,将它复制到某个地方,将副本的名称修改为mkl,并将mkl.h的内容(位于“/opt/intel/composer_xe_2013_sp1.1.103/mkl/include ”在我的mac上)在其中,将其保存在“/opt/intel/composer_xe_2013_sp1.1.103/mkl/include”中,我在的include目录中引用了目录“/opt/intel/composer_xe_2013_sp1.1.103/mkl/include”我的 xcode 项目。我是怎么做到的?

    我双击“目标”,然后单击“构建设置”,然后单击“全部”,然后搜索“搜索路径”菜单。那里

    1)在“header search path”中,调试和发布,我把“/opt/intel/composer_xe_2013_sp1.1.103/mkl/include”和“/opt/intel/composer_xe_2013_sp1.1.103/mkl/include/intel64”

    2)在“库搜索路径”中,调试和发布我把“/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib/intel64”和“/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib”和“ /opt/intel/composer_xe_2013_sp1.1.103/mkl/lib"

    然后我编辑了“DYLD_LIBRARY_PATH”环境变量(仅在我的项目中),使其等于“/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib:/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib/intel64 :/opt/intel/composer_xe_2013_sp1.1.103/mkl/lib”。我是怎么做到的?我在上栏左侧的三角形和方形按钮旁边单击我的项目图标的名称,然后单击打开一个窗口的“编辑方案”,然后单击“运行我的项目调试”在该窗口的左栏中,然后我单击“参数”,进入“环境变量”,然后添加一个名为 DYLD_LIBRARY_PATH 的新变量,其值为

    /opt/intel/composer_xe_2013_sp1.1.103/compiler/lib:/opt/intel/composer_xe_2013_sp1.1.103/compiler/lib/intel64:/opt/intel/composer_xe_2013_sp1.1.103/mkl/lib

    奇怪的是,这也设置为“运行我的项目发布”,这对我来说没问题,但我仍然觉得这很奇怪。无论如何。

    在此之后,我必须添加命令告诉编译器(LLVM 5,没有修改与此相关的任何内容)链接到我将要使用的库:

    为此,我双击“目标”,然后进入“构建设置”,然后进入“全部”,然后在调试和发布中搜索“其他链接器标志”:

    -lmkl_sequential -lmkl_core -lmkl_intel_lp64 -lpthread -lmkl_intel_thread -liomp5

    然后在 main.cpp 中,例如:

    #include <iostream>
    // #include "/opt/intel/composer_xe_2013_sp1.1.103/mkl/include/mkl.h"
    // #include "/opt/intel/composer_xe_2013_sp1.1.103/mkl/include/mkl_vsl.h"
    // #include "/opt/intel/composer_xe_2013_sp1.1.103/mkl/include/mkl_vsl_functions.h"
    #include <mkl>
    #include <mkl_vsl.h>
    #include <mkl_vsl_functions.h>
    
    int main(int argc, const char * argv[])
    {
        VSLStreamStatePtr stream;
        vslNewStream(&stream, VSL_BRNG_SFMT19937, 777);
        double * pUNIF = new double [ 1000000 ] ;
        vdRngUniform(VSL_RNG_METHOD_UNIFORM_STD_ACCURATE, stream, 1000000, pUNIF, 0.0, 1.0);
        vslDeleteStream(&stream);
        for (int i = 0 ; i < 100000 ; ++i )
        {
            std::cout << *(pUNIF+i) << std::endl;
        }
        std::cout << "END." << std::endl;
        getchar();
        return 0;
    }
    

    然后我构建并运行,我一切都很好;-)

    正如亲爱的马尔科姆·塔克爵士所说:“永远不容易,永远不会容易。”

    问候,

    MEF。

    【讨论】:

    • 当我在 xcode 中运行构建的东西时,我上面写的所有内容都有效。但是当我进入构建可执行文件的目录并在那里运行它时,我会收到 /Users/totouser/Library/Developer/Xcode/DerivedData/THEC‌​ONSOLEAPPLICATION-hk‌​najgycvjjcotdtkeeyxb‌​zmtfty/Build/Product‌​s/调试/THECONSOLEAP‌​应用程序;出口; dyld:库未加载:libmkl_sequential.dylib 引用自:/Users/totouser/Library/Developer/Xcode/DerivedData/THEC‌​ONSOLEAPPLICATION-hk‌​najgycvjjcotdtkeeyxb‌​zmtfty/Build/Product‌​s/Debug/THECONSOLEAP‌​PLICATION 想法?原因:找不到图像 Trace/BPT 陷阱:5
    【解决方案2】:

    对于 OS X 10.6.8 上的 ICC 11.1,MKL 框架在这里:

    /opt/intel/Compiler/11.1/058/Frameworks/mkl
    

    假设这是一个较新的版本(ICC 12?),如果英特尔已移动它,您可能只需要挖掘一下即可找到相关目录。

    (请注意,您链接到的英特尔文章来自 2009 年 6 月,与 ICC 11.0 相关。)

    【讨论】:

    • 谢谢,@Paul。我还阅读了this 2011 guide,但我无法理解相关部分(“将您的应用程序与英特尔® 数学核心函数库链接”)。它似乎是为从命令行运行编译器而设计的,但我正在尝试使用 Xcode。我没有经验知道如何翻译说明。顺便说一句,我在目录 /Intel/ 中没有包含字母“framework”的文件夹。
    • 您可能需要返回并重新运行英特尔安装程序并确保确实安装了 MKL。你也可以尝试在你的磁盘中搜索mkl.h - 对我来说这是/opt/intel/Compiler/11.1/058/Frameworks/mkl/Headers
    • 我重新运行了安装程序,没有任何变化。唯一的 mkl.h 文件位于 /Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/include (以及非 Xcode 安装中预期的相同副本 /opt/intel/...)。我不知道这是否是我应该在标题搜索路径下列出的内容,但我很久以前就这样做了。我还将 /Developer/opt/intel/composer_xe_2011_sp1.6.038/mkl/lib 列为库搜索路径,并添加了以下链接器标志: -libmkl_intel_lp64.a -libmkl_core.a -libmkl_sequential.a -libmkl_intel_thread.a 。没有任何变化,同样的错误。
    • 抱歉 - 我不知道还有什么可以推荐的 - 不过你可能想试试英特尔开发者论坛,因为它们会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多