将代码移动到函数中时,在 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 序号的主要内容,如果未能解决你的问题,请参考以下文章
AccessViolationException将数组传递给本机函数
C++ Visual Studio Windows:如何在 dll 中声明但不定义外部函数