PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : cross compiling Linux -> windows



onkel-pit
20-07-2005, 05:27
Hi,
bin neu in diesem Forum und wünsche erstmal allen einen schönen guten Morgen.

So, ich habe folgendes Problem. Ich möchte eine selbstgeschrieben DLL auf Linux cross compilen.

Soweit so gut. Habe mingw32 via apt installiert und getestet.

Habe das/die Makefile von Dev-Cpp abgeändert, da die DLL ursprünglich ein Dev-Cpp Projekt war.

Hier das/die Makefile:



# Project: cosmo
# Makefile created by Dev-C++ 4.9.9.1 edited by pit 1.0 ;)

CPP = i586-mingw32msvc-g++
CC = i586-mingw32msvc-gcc
WINDRES = i586-mingw32msvc-windres
RES =
OBJ = dllmain.o dllsql.o $(RES)
LINKOBJ = dllmain.o dllsql.o $(RES)
LIBS = -L/usr/i586-mingw32msvc/lib -lmySQL --no-export-all-symbols --add-stdcall-alias
INCS = -I/usr/i586-mingw32msvc/include
CXXINCS = -I/usr/i586-mingw32msvc/include/c++/3.3.1 -I/usr/i586-mingw32msvc/include/c++/3.3.1/mingw32 -I/usr/i586-mingw32msvc/include/c++/3.3.1/backward -I/usr/i586-mingw32msvc/include
BIN = cosmo.dll
CXXFLAGS = $(CXXINCS) -DBUILDING_DLL=1 -Wall
CFLAGS = $(INCS) -DBUILDING_DLL=1 -Wall

.PHONY: all all-before all-after clean clean-custom

all: all-before cosmo.dll all-after


clean: clean-custom
rm -f $(OBJ) $(BIN)

DLLWRAP=i586-mingw32msvc-dllwrap
DEFFILE=libcosmo.def
STATICLIB=libcosmo.a

$(BIN): $(LINKOBJ)
$(DLLWRAP) --output-def $(DEFFILE) --driver-name c++ --implib $(STATICLIB) $(LINKOBJ) $(LIBS) -o $(BIN)

dllmain.o: dllmain.cpp
$(CPP) -c dllmain.cpp -o dllmain.o $(CXXFLAGS)

dllsql.o: dllsql.cpp
$(CPP) -c dllsql.cpp -o dllsql.o $(CXXFLAGS)


So das hier ist nun die Ausgabe von make:


pit@tioz:~/cosmo$ make
i586-mingw32msvc-g++ -c dllmain.cpp -o dllmain.o -I/usr/i586-mingw32msvc/include/c++/3.3.1 -I/usr/i586-mingw32msvc/include/c++/3.3.1/mingw32 -I/usr/i586-mingw32msvc/include/c++/3.3.1/backward -I/usr/i586-mingw32msvc/include -DBUILDING_DLL=1 -Wall
i586-mingw32msvc-g++ -c dllsql.cpp -o dllsql.o -I/usr/i586-mingw32msvc/include/c++/3.3.1 -I/usr/i586-mingw32msvc/include/c++/3.3.1/mingw32 -I/usr/i586-mingw32msvc/include/c++/3.3.1/backward -I/usr/i586-mingw32msvc/include -DBUILDING_DLL=1 -Wall
i586-mingw32msvc-dllwrap --output-def libcosmo.def --driver-name c++ --implib libcosmo.a dllmain.o dllsql.o -L/usr/i586-mingw32msvc/lib -lmySQL --no-export-all-symbols --add-stdcall-alias -o cosmo.dll
i586-mingw32msvc-dllwrap: no export definition file provided.
Creating one, but that may not be what you want
/usr/bin/ld: unrecognized option '--base-file'
/usr/bin/ld: use the --help option for usage information
collect2: ld returned 1 exit status
i586-mingw32msvc-dllwrap: c++ exited with status 1
make: *** [cosmo.dll] Fehler 1


Was mich wundert ist, dass er ld anstelle von i586-mingw32msvc-ld verwenden will.
Habe ich schon mal /usr/bin/ld in ld.old umgenannt und i586...-ld nach /usr/bin/ld gelinkt.
Dann kommt folgender Fehler:



tioz:/home/pit/cosmo# make
i586-mingw32msvc-g++ -c dllmain.cpp -o dllmain.o -I/usr/i586-mingw32msvc/include/c++/3.3.1 -I/usr/i586-mingw32msvc/include/c++/3.3.1/mingw32 -I/usr/i586-mingw32msvc/include/c++/3.3.1/backward -I/usr/i586-mingw32msvc/include -DBUILDING_DLL=1 -Wall
i586-mingw32msvc-g++ -c dllsql.cpp -o dllsql.o -I/usr/i586-mingw32msvc/include/c++/3.3.1 -I/usr/i586-mingw32msvc/include/c++/3.3.1/mingw32 -I/usr/i586-mingw32msvc/include/c++/3.3.1/backward -I/usr/i586-mingw32msvc/include -DBUILDING_DLL=1 -Wall
i586-mingw32msvc-dllwrap --output-def libcosmo.def --driver-name c++ --implib libcosmo.a dllmain.o dllsql.o -L/usr/i586-mingw32msvc/lib -lmySQL --no-export-all-symbols --add-stdcall-alias -o cosmo.dll
i586-mingw32msvc-dllwrap: no export definition file provided.
Creating one, but that may not be what you want
/usr/bin/ld: unrecognised emulation mode: elf_i386
Supported emulations: i386pe
collect2: ld returned 1 exit status
i586-mingw32msvc-dllwrap: c++ exited with status 1
make: *** [cosmo.dll] Fehler 1


Danke schonmal für die Hilfe im vorraus. :)

MfG
pit

anda_skoa
20-07-2005, 13:34
Hmm, ich hab da keine Lösung für das Crosscompiling, aber vielleicht wäre es einfacher Dev-Cpp direkt unter Wine zu starten und sozusagen "in Windows" zu kompilieren.

Ciao,
_

onkel-pit
20-07-2005, 16:45
hm naja Dev-Cpp ließ sich bei mir nicht emulieren. Keine Ahnung warum.

Aber es ist ja auch bloß ein falscher Flag der gesetzt wurde. Habe nämlich ld --help durchforstet und rausgefunden das der flag nur -b heißt. Aber das komische ist, ich habe diesen Flag nirgends gesetzt. :(

onkel-pit
24-07-2005, 21:59
so habs nun gelöst.

Hier die Befehle mit denen ich das bewerkstellige.


#!/bin/bash
# compile
i586-mingw32msvc-g++ dllmain.cpp dllsql.cpp -Wall -c -I/usr/i586-mingw32msvc/include/c++/3.3.1 -I/usr/i586-mingw32msvc/include/c++/3.3.1/mingw32 -I/usr/i586-mingw32msvc/include/c++/3.3.1/backward -I/usr/i586-mingw32msvc/include -DBUILDING_DLL

#link
i586-mingw32msvc-g++ -shared -o cosmo.dll dllmain.o dllsql.o -I/usr/i586-mingw32msvc/include/c++/3.3.1 -I/usr/i586-mingw32msvc/include/c++/3.3.1/mingw32 -I/usr/i586-mingw32msvc/include/c++/3.3.1/backward -I/usr/i586-mingw32msvc/include -L/usr/i586-mingw32msvc/lib -L/usr/lib -lmysqlclient -lmySQL --add-stdcall-alias -Wall --out-implib libcosmo.a


mfg pit

P.S. habe gemerkt das man bei gcc bzw. g++ immer die source dateien an den anfang stellen sollte. hatte beim linken errors als die hinten standen.

P.P.S. war bisher zu faul ne makefile zu schreiben, da es immer noch nicht tut. weil er dein einsprungspunkt zu mysql_connect nicht findet ... :(