Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

makefile, windows, próba kompilacji biblioteki libnodave

Ostatnio zmodyfikowano 2016-10-18 10:43
Autor Wiadomość
mateczek
Temat założony przez niniejszego użytkownika
makefile, windows, próba kompilacji biblioteki libnodave
» 2016-09-26 08:12:36
Napisałem kilka programików z użyciem  biblioteki nodave (dostęp do PLC) http://libnodave.sourceforge.net/
Zamarzyło mi się by napisać opakowanie do tej biblioteki. Czyli napisać własną bibliotekę i podlinkować statycznie nodave (musiało by to być do użytku na windows).

Mój problem zaczął się w momencie gdy zobaczyłem skrypty makefile. \
1. nie ma skryptu pod mingw
2. nie ma configure.

Stąd moje pytanie. Jak przerobić skrypt makefile linuxowy(najbliższy mingw), tak by skompilował bibliotekę (najlepiej do linkowania statycznego pod windowsem)
Najpierw wrzucę skrypt oryginalny dla visuala
https://wklej.to/TMtwC

teraz oryginalny skrypt dla dla linuxa który to chciałbym jakoś przerobić gdyż wydaje się najlepiej pasować do mingw
https://wklej.to/XXjW3

Dodam, że nie zależy mi na kompilacji przykładów tylko samej biblioteki. Chciałbym by była zdolna do linkowania statycznego (o ile to możliwe)
Wymodziłem coś takiego metodą prób i błędów. I nawet coś buduje. Jednak podmianka dllki w działającym programie wywala błędy typu "nie znaleziono pukntu wejścia do procedury"

A próba re-kompilacji programu przez statyczne dołączenie kończy się komunikatem kompilatora "undefined reference".
(i sam naprawdę nie wiem czy to wina niumięjętnego linkowania czy źle zbudowanej biblioteki. Choć podejrzewam, że to drugie)


Haskell

CFLAGS= -c -Wall -Winline -DBCCWIN -DDAVE_LITTLE_ENDIAN -fPIC
LIBRARIES=libnodave.dll libnodave.a
CFLAGS_DLL = -Wall -O0 -g -shared -Wl,--subsystem,windows -DDLL
LIBS= -lwsock32
all:  $(LIBRARIES)

libnodave.a: nodave.o setportw.o openSocketw.o openS7online.o
 ar -rcs $@ $^
 
libnodave.dll: nodave.o setportw.o openSocketw.o openS7online.o
 $(CC) -o $@ $(CFLAGS_DLL) $^ $(LIBS)

clean:
 rm -f *.a
 rm -f *.o
 rm -f *.dll

nodave.o: nodave.h log2.h
openSocket.o: openSocket.h nodave.h log2.h
oto jaki makefile wykombinowałem:
komendą "ar" chciałem zbudować bibliotekę do linkowania statycznego . Nie wiem czy to dobrze?? i prawdę mówiąc nie bardzo wiem czym się różni plik z rozszerzeniem "*.lib" od "*.a"
poniżej tego jest moja próba zbudoania dll z obiektów: nodave.o, setportw.o, openSocketw.o, openS7online.o
Coś tam się buduje ale z działaniem jest gorzej :)
P-152038
mateczek
Temat założony przez niniejszego użytkownika
» 2016-09-29 20:37:49
kurcze chyba będzie lipa z tą biblioteką pogrzebałem i trafiłem na wątek
http://stackoverflow.com​/questions/5159353​/how-can-i-get-rid-of-the-imp-prefix-in-the-linker-in-vc

W opisie nie podałem, że błędy to undefined reference _imp_cos :P moja wina. Ten przedrostek był kluczowy w namierzeniu przyczyny problemu.
Z tego wynika, że chyba bym musiał cały kod przekopać ręcznie :( i pousuwać importy dll
P-152106
mateczek
Temat założony przez niniejszego użytkownika
» 2016-10-03 10:35:33
tutaj jest link do pliku nagłówkowego libnodave
https://github.com/netdata​/libnodave/blob/master/nodave.h

a w środku takie badziewie

C/C++
#ifdef BCCWIN
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define DECL2 __stdcall   //co to jest ten decl2 i czy można to bezkarnie wywalić
#define tmotype int

#ifdef DOEXPORT
#define EXPORTSPEC __declspec (dllexport) 
#else
#define EXPORTSPEC __declspec (dllimport)    //drugie coś co chyba bym musiał wywalić aby mi się ta biblioteka skompilowała do statycznego linkowania ??
#endif


pytam bo potem przed każdą funkcją są oba przedrostki i nie wiem czy można to wywalić ??
EXPORTSPEC int DECL2 daveResetIBH( daveInterface * di );
P-152208
Gibas11
» 2016-10-06 19:42:25
C/C++
#ifdef DOEXPORT
#define EXPORTSPEC __declspec (dllexport) 
#else
#define EXPORTSPEC __declspec (dllimport)
#endif
Biblioteka zakłada, że albo exportujesz bibliotekę do dll, albo ładujesz z dll. Chyba jeśli wywalisz ten kawałek i pokombinujesz trochę przy kompilatorze powinieneś móc to skompilować do .a i ew. wygenerować jakieś dodatkowe pliki jeśli są potrzebne.

//edit:
C/C++
#define DECL2 __stdcall   //co to jest ten decl2 i czy można to bezkarnie wywalić
To chyba tylko standardowa konwencja wywołań ze zmienioną nazwą, może mógłbyś to usunąć ale musiałbyś zastąpić wszystkie wystąpienia
DECL2
 używając
__stdcall
. Generalnie nie widzę za bardzo powodu, żeby to robić. Zwłaszcza, że DECL2 to jakiś uniksowy twór, więc na tych systemach mógłbyś stracić na wydajności / wszystko popsuć zastępując tym czego używasz tam na Windowsie.
P-152304
mateczek
Temat założony przez niniejszego użytkownika
» 2016-10-06 20:29:00
@Gibas11 Dzięki. Dziś jak będę miał w robocie luzik bo mam nocke to pokombinuję. Wywalam export dll zostawiam decel i próbuje kompilować, a następnie podlinkować statycznnie. Może mi się jeszcze uda test z prawdziwym "plc" zrobić
P-152305
mateczek
Temat założony przez niniejszego użytkownika
» 2016-10-18 10:43:52
Dzięki za pomoc pierwsza wersja już mi działa !!!

1 omówienie źródeł
https://www.youtube.com/watch​?v=jz-I742mdko

2 użycie biblioteki
https://www.youtube.com/watch​?v=ZG9NgYZTolE
P-152627
« 1 »
  Strona 1 z 1