Создайте действительную общую библиотеку в C - PullRequest
1 голос
/ 08 марта 2011

Я делаю тест, чтобы узнать, как создать общую библиотеку.Это шаблон для общих библиотек в Code :: Blocks:

library.c

// The functions contained in this file are pretty dummy
// and are included only as a placeholder. Nevertheless,
// they *will* get included in the shared library if you
// don't remove them :)
//
// Obviously, you 'll have to write yourself the super-duper
// functions to include in the resulting library...
// Also, it's not necessary to write every function in this file.
// Feel free to add more files in this project. They will be
// included in the resulting library.

// A function adding two integers and returning the result
int SampleAddInt(int i1, int i2)
{
    return i1 + i2;
}

// A function doing nothing ;)
void SampleFunction1()
{
    // insert code here
}

// A function always returning zero
int SampleFunction2()
{
    // insert code here

    return 0;
}

Я попытался скомпилировать его, и он был скомпилирован без каких-либо ошибок или предупреждений.Но когда я попытался использовать его с ctyped.cdll.LoadLibrary ("library path.dll") в python 3 (который на самом деле должен работать как функция C), он сказал, что это не было допустимым приложением win32.И python, и code :: blocks являются 32-битными (код: блоки компилируются с помощью gcc, и я попытался использовать установленную версию mingw в моей системе, но она выдает ошибку об отсутствующей библиотеке), пока я работаю над win 764bit

Знаете ли вы, в чем может быть проблема, или если я делаю что-то не так?

EDIT1: я на Windows 7 64bit, в файле спецификации компилятора написано: «Модель потока: win32, gcc версия 3.4.5 (mingw-vista special r3)», и я использовал команду

gcc.exe -shared -o library.dll library.c

в Python, я использовал

from ctypes import *

lib = cdll.LoadLibrary("C:\\Users\\Francesco\\Desktop\\C programmi\\Python\\Ctypes DLL\\library.dll")

и ошибкубыл

WindowsError: [Error 193] %1 is not a valid Win32 application

я установил оба python3.1 и mingw из двоичного пакета и не компилировал их в моей системе

EDIT2: после прочтения ответа Marc.

main.h

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

DLL_EXPORT int MySimpleSum(int A, int B);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

main.c

#include "main.h"

// a sample exported function
DLL_EXPORT int MySimpleSum(int A, int B)
{
    return A+B;
}

опции компиляции

gcc -c _DBUILD_DLL main.c
gcc -shared -o library.dll main.o -Wl,--out-implib,liblibrary.a

с gcc 4.5.2 все равно выдают ту же ошибку ..

1 Ответ

1 голос
/ 08 марта 2011

Я считаю, что в среде Windows вам нужно использовать аннотацию __declspec. Как создать общую библиотеку и использовать __declspec описано здесь: Создание DLL в MingW .

...