dll و تابع loadlibrary در GCC - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

dll و تابع loadlibrary در GCC

0 امتیاز
توی GCC میخوام یه DLL فراخوانی کنم اما تابع LoadLibrary رو پشتیبانی نمیکنه

حالا میخوام یه برنامه توی c بنویسم که یه تابعی از یه dll فراخوانی کنه

حتماً باید با GCC کمپایل کنم وگرنه توی vc و با cl.exe میتونم و مشکلی ندارم

کسی نظری برای حل این مشکل نداره

خود  DLL رو خودم توی GCC نوشتم
سوال شده مرداد 2, 1393  بوسیله ی Fire360Boy (امتیاز 2,524)   6 24 43

1 پاسخ

+2 امتیاز

از  __declspec(dllexport و  __declspec(dllimport استفاده کن 

مثلا فرض کن dll دو تا  تا فایل داره test.h test.c 

test.h

#ifndef TEST_H
#define TEST_H

#ifdef EXPORTING
#define TEST_DLL __declspec(dllexport)
#else
#define TEST_DLL __declspec(dllexport)
#endif

int TEST_DLL foo();

#endif  // TEST_H

test.c

#include "test.h"
int foo()
{
   return 1;
}

حالا برای بیلد کردن از این 2 دستور استفاده کن :

gcc -c -DEXPORTING test.c
gcc -shared -o test.dll test.o

دستور اول بعد از define کردن EXPORTING میاد object file رو میسازه

دستور دوم هم برای ساخت dll استفاده میشه .

اگر بخوای فایل .a رو هم داشته باشی که بتونی بعدا داخل vs هم از dll استفاده کنی با این دستور

gcc -shared -o test.dll test.o -Wl,--out-implib,libtest.a

 

الان فرضا اگر بخوای dll رو داخل main.c استفاده کنی  :

#include "test.h"
#include <stdio.h>

int main()
{
    int a=foo();
    printf("%d",a);
    return 1;
}

با این 2 کد main.c رو کامپایل می کنیم :

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

برای build کردن به شکل static ; 

gcc -c main.c
gcc -static main.o -L. -ltest -o main.exe

 

 

پاسخ داده شده مرداد 2, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده مرداد 2, 1393 بوسیله ی BlueBlade
با تشکز از پاسخ
من با اینها آشنا هستم
اما این بدرد من نمیخوره چون کدمو با vs نوشتم اذیت میکنه
و اینکه این یه ماژول برای پایتونه که یکم کار دیباگ رو سخت میکنه
لطفا اگه میتونید بکین چجوری توی GCC دی ال ال لود کنم
این چیزایی که گفتم مال gcc  بود !
بعد توی سوال گفتی که توی gcc نوشتم نه vs
الان دقیقا با چی نوشته شده ؟!
با gcc الان می خوای کامپایل کنی یا ++g ؟
اگر با g++ باید توابع رو داخل extern "c هم بزاری
طبق توضیحاتی که داخل این لینک داده با vs هم میشه dll رو بیلد و  استفاده کرد دلیل خاصی داره که با gcc بیلد کنی ؟ https://docs.python.org/2/extending/windows.html#building-on-windows
اشتباه گفتم با vs نوشتم
من هرچی dll با vs نوشتم نتونستم نه ایمپورت کنم نه ماژول کنم
از این دستور
import ctypes
ctypes.cdll.loadlibrary()

ببین میتونی دی اللی که با vs یا vb نوشته شده لود کنی
والا یه یه هفته ای گیرم
...