在Windows中使用GCC中的OpenMP来创建DLL

时间:2013-10-01 05:57:47

标签: c windows gcc dll vb6

我最近开始玩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)。奇怪的是,只要在.c文件中存在一个单独的OpenMP“命令”,即使我调用的函数甚至不包含单行OpenMP代码,VB编译器也会声称缺少DLL。当我评论所有OpenMP东西时,该函数按预期工作,但当然不使用OpenMP进行并行化。

这里有什么问题?任何帮助表示感谢,提前感谢! : - )

1 个答案:

答案 0 :(得分:0)

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