1

I've recently started to play around with OpenMP and like it very much.

I am a just-for-fun Classic-VB programmer and like coding functions for my VB programs in C. As such, I use Windows 7 x64 and GCC 4.7.2. I usually set up all my C functions in one large C file and then compile a DLL out of it. Now I would like to use OpenMP in my DLL.

First of all, I set up a simple example and compiled an exe file from it:

#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);
}

I compile that using gcc -fopenmp !MyC.c -o !MyC.exe and it works like a charm.

However, when I try to use OpenMP in my DLL, it fails. For example, I set up this function:

__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());
}

The structs are defined, of course. I compile that using

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

The compiler and linker do not complain (not even warnings come up) and the dll file is actually being built. But as I try to call the function from within VB, the VB compiler claims the the DLL file could not be found (run-time error 53). The strange thing about that is that as soon as one single OpenMP "command" is present inside the .c file, the VB compiler claims a missing DLL even if I call a function that does not even contain a single line of OpenMP code. When I comment all OpenMP stuff out, the function works as expected, but doesn't use OpenMP for parallelization, of course.

What is wrong here? Any help appreciated, thanks in advance! :-)

4

1 回答 1

0

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

于 2013-10-01T06:02:35.277 回答