2014-01-19 4 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

Это происходит: > НКУ -o main.exe основной. o dll main.dll main.o: файл не распознан: формат файла не распознан collect2.exe: ошибка: ld возвращено 1 статус выхода – Wix

+0

Да! Он работает сейчас! Спасибо! :) – Wix

Смежные вопросы