gpt4 book ai didi

c - C 中的 OpenMP 在 Windows 中使用 GCC 创建 DLL

转载 作者:太空宇宙 更新时间:2023-11-04 04:47:48 27 4
gpt4 key购买 nike

我最近开始使用 OpenMP 并且非常喜欢它。

我是一个纯粹的 Classic-VB 程序员,喜欢用 C 编写我的 VB 程序的函数。因此,我使用 Windows 7 x64 和 GCC 4.7.2。我通常在一个大的 C 文件中设置我所有的 C 函数,然后从中编译一个 DLL。现在我想在我的 DLL 中使用 OpenMP。

首先,我设置了一个简单的示例并从中编译了一个 exe 文件:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int n = 520000;
int i;
int a[n];
int NumThreads;

omp_set_num_threads(4);

#pragma omp parallel for
for (i = 0; i < n; i++)
{
a[i] = 2 * i;
NumThreads = omp_get_num_threads();
}

printf("Value = %d.\n", a[77]);
printf("Number of threads = %d.", NumThreads);
return(0);
}

我使用 gcc -fopenmp !MyC.c -o !MyC.exe 编译它,它就像一个魅力。

但是,当我尝试在我的 DLL 中使用 OpenMP 时,它失败了。例如,我设置了这个功能:

__declspec(dllexport) int __stdcall TestAdd3i(struct SAFEARRAY **InArr1, struct SAFEARRAY **InArr2, struct SAFEARRAY **OutArr) //OpenMP Test
{
int LengthArr;
int i;
int *InArrElements1;
int *InArrElements2;
int *OutArrElements;

LengthArr = (*InArr1)->rgsabound[0].cElements;

InArrElements1 = (int*) (**InArr1).pvData;
InArrElements2 = (int*) (**InArr2).pvData;
OutArrElements = (int*) (**OutArr).pvData;

omp_set_num_threads(4);

#pragma omp parallel for private(i)
for (i = 0; i < LengthArr; i++)
{
OutArrElements[i] = InArrElements1[i] + InArrElements2[i];
}

return(omp_get_num_threads());
}

当然,结构是定义好的。我编译它使用

gcc -fopenmp -c -DBUILD_DLL dll.c -o dll.o
gcc -fopenmp -shared -o mydll.dll dll.o -lgomp -Wl,--add-stdcall-alias

编译器和链接器不会提示(甚至不会出现警告)并且实际上正在构建 dll 文件。但是当我尝试从 VB 中调用该函数时,VB 编译器声称找不到 DLL 文件(运行时错误 53)。奇怪的是,只要一个 OpenMP“命令”出现在 .c 文件中,VB 编译器就会声称缺少 DLL,即使我调用的函数甚至不包含一行 OpenMP 代码也是如此。当我注释掉所有 OpenMP 内容时,函数会按预期工作,但当然不会使用 OpenMP 进行并行化。

这里有什么问题?任何帮助表示赞赏,在此先感谢! :-)

最佳答案

在这种情况下,最有可能的问题是未设置 LD_LIBRARY_PATH。您必须将 LD_LIBRARY_PATH 设置为包含 dll 的路径,否则系统将无法找到它并因此提示相同

关于c - C 中的 OpenMP 在 Windows 中使用 GCC 创建 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19109002/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com