【发布时间】: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。