将代码移动到函数中时,在 DLL“myApp.exe”中找不到错误 0xC0000138 序号

Posted

技术标签:

【中文标题】将代码移动到函数中时,在 DLL“myApp.exe”中找不到错误 0xC0000138 序号【英文标题】:Error 0xC0000138 Ordinal not found in DLL "myApp.exe" when moving code into function 【发布时间】:2019-07-24 08:00:30 【问题描述】:

我想试用 Blaze 线性代数库并从一个简单的测试程序开始。它看起来像这样:

#include <iostream>

#include <blaze/Blaze.h>

typedef blaze::DynamicVector<int, blaze::columnVector> bdVector;

int main(int argn, char** argc) 

    bdVector a 1, 2, 3 ;

    std::cout << a+a << std::endl;

    return 0;

这很好用。但是当我将代码移动到一个单独的函数中时,就像这样

#include <iostream>

#include <blaze/Blaze.h>

typedef blaze::DynamicVector<int, blaze::columnVector> bdVector;

bdVector func(bdVector a, bdVector b)  return a + b; 

int main(int argn, char** argc) 

    bdVector a 1, 2, 3 ;

    std::cout << func(a,a) << std::endl;

    return 0;

我得到了错误

The Ordinal 968 was not found in DLL "PATH/blaze-test.exe"显然与ntdll.dll有关:

Exception at 0x00007FFA7128EB78 (ntdll.dll) in blaze-test.exe: 0xC0000138: Ordinal Not Found.

当我用谷歌搜索这个错误时,我没有找到相关的东西,所以我希望这里有一些想法。

最好的问候

ps:以防万一:我使用了 CMake 和 Visual Studio 2019 并构建了调试和发布配置(在发布时它只是序号 900)

编辑:这似乎不是因为功能。我将此行添加到工作代码中

bdVector b = a;

这个赋值导致同样的错误。

【问题讨论】:

出于好奇,当 args 是引用而不是按值复制时会发生什么? 指针也一样。 我猜它找到的 Blaze DLL 版本与您链接的 .lib 版本不同。为什么在您移动代码时会发生这种情况,因为在幕后您可能会添加对复制或移动构造函数的调用,而这是在运行时找不到的序数。 (ntdll 将是执行序号查找的地方,因此不是问题的一部分。)您可能可以通过挖掘您正在使用的 .lib 来检查这一点,或者正确版本的 DLL 上的“dumpbin /exports”将也列出导出和序数。 Blaze 是使用 CMake 中的接口库链接的仅标头库。它没有 dll/libs。 【参考方案1】:

我发现了问题。似乎 MKL 带有一个用于 OpenMP 的库。因此,由于 CMake 中的 find_package(OpenMP) 存在两个 OpenMP 库。它适用于 Clang,因为 Clang 没有找到 OpenMP。

但是我不明白为什么在我使用分配时会发生这种情况。我希望它总是会发生,或者当我使用使用 OpenMP 的操作时会发生这种情况。

【讨论】:

以上是关于将代码移动到函数中时,在 DLL“myApp.exe”中找不到错误 0xC0000138 序号的主要内容,如果未能解决你的问题,请参考以下文章

将 dll 的配置文件移动到调用 dll 的应用程序

AccessViolationException将数组传递给本机函数

C++ Visual Studio Windows:如何在 dll 中声明但不定义外部函数

C#在我的项目中包含引用dll

需要如何帮助将 system.serviceModel 配置部分移动到我的代码中

当键盘出现在 Swift 中时 UITextField 向上移动