DLL编译错误

时间:2014-01-19 05:27:21

标签: c gcc dll

我又遇到了问题。我能够正确编译我的DLL。但是一旦我开始将它链接到一个可以编译的可执行文件。发生了一些事情。

这是CMD:

>gcc -c -o dllmain.o dllmain.c -D ADD_EXPORTS
>gcc -o dllmain.dll dllmain.o -s -shared -Wl,--subsystem,windows

这部分结果很好,产生了一个看似好看的dllmain.dll。

以下是问题的开始:

>gcc -c -o dllmain.o dllmain.c
>gcc -o main.exe -s main.o -L. -ladd
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -ladd
collect2.exe: error: ld returned 1 exit status

有人可以告诉我它出现的原因吗? (所有文件名都经过三重检查,并且是正确的!)

这是“dllmain.c”

/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>

DLLIMPORT void HelloWorld()
{
    MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
}

DLLIMPORT CALL add(int a, int b)
{
   return a + b;
}

DLLIMPORT CALL subtract(int a, int b)
{
    return a - b;
}

DLLIMPORT CALL multiply(int a, int b)
{
   return a * b;
}

DLLIMPORT CALL divide(int a, int b)
{
    if(b = 0)
    {
        MessageBox(0, "Cannot divide by zero!", "Division Error", 1);
        return;
    }
    return a / b;
}

DLLIMPORT CALL modulo(int a, int b)
{
    if(b = 0)
    {
        MessageBox(0, "Cannot divide by zero!", "Modulo Error", 1);
    }
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
        {
            break;
        }
        case DLL_PROCESS_DETACH:
        {
            break;
        }
        case DLL_THREAD_ATTACH:
        {
            break;
        }
        case DLL_THREAD_DETACH:
        {
            break;
        }
    }

    /* Return TRUE on success, FALSE on failure */
    return TRUE;
}

这是“dll.h”

#if ADD_EXPORTS
#define DLLIMPORT __declspec(dllexport)
#else
#define DLLIMPORT __declspec(dllimport)
#endif

#define CALL __cdecl

#ifdef __cplusplus
extern "C"
{
#endif

DLLIMPORT void HelloWorld();
DLLIMPORT CALL add(int a, int b);
DLLIMPORT CALL subtract(int a, int b);
DLLIMPORT CALL multiply(int a, int b);
DLLIMPORT CALL divide(int a, int b);
DLLIMPORT CALL modulo(int a, int b);

#ifdef __cplusplus
}
#endif

最后,“main.c”

#include <stdio.h>
#include <stdlib.h>
#include "dll.h"

main()
{
    int a, b, c;
    char chc;
    printf("Input 2 numbers: ");
    printf("Input operation: ");
    scanf("%c", &chc);
    switch(chc)
    {
        case '+': addition(a, b); break;
        case '-': subtraction(a, b); break;
        case '*': multiply(a, b); break;
        case '/': divide(a, b); break;
        case '%': modulo(a, b); break;
    }
    getch();
}

1 个答案:

答案 0 :(得分:1)

只需使用:

gcc -o main.exe main.c dllmain.dll

链接器查找libadd.a,在您的情况下不存在

同样,对于编译,您不必提供dllmain.o

相关问题