2014-01-19 97 views
1

我再次遇到問題。我能夠正確編譯我的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(); 
} 

回答

0

只需使用:

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

鏈接尋找libadd.a,這並不在你的情況爲你編譯沒有提供dllmain.o

+0

這種情況存在

另外: > gcc的-o MAIN.EXE爲主。 o dll main.dll main.o:文件無法識別:文件格式無法識別 collect2.exe:錯誤:ld返回1退出狀態 – Wix

+0

是的!它現在有效!謝謝! :) – Wix