【问题标题】:OpenMP in C using GCC in Windows to create DLLC 中的 OpenMP 使用 Windows 中的 GCC 创建 DLL
【发布时间】:2013-10-01 05:57:46
【问题描述】:

我最近开始玩 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“命令”,VB 编译器就会声称缺少 DLL,即使我调用的函数甚至不包含一行 OpenMP 代码。当我注释掉所有 OpenMP 内容时,该函数按预期工作,但当然不使用 OpenMP 进行并行化。

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

【问题讨论】:

    标签: c windows gcc dll vb6


    【解决方案1】:

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

    【讨论】:

    • 谢谢你,你说得对。不仅必须提供“libgomp-1.dll”的路径,还必须提供“pthreadGC2.dll”的路径(即使它们在大多数 MinGW 安装中应该相同)。
    • 对此感到抱歉。完成。
    猜你喜欢
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多