Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

statičko linkovanje msvcr71.dll-a

[es] :: C/C++ programiranje :: statičko linkovanje msvcr71.dll-a

[ Pregleda: 3364 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.neobee.net.

Jabber: DarkMan


Profil

icon statičko linkovanje msvcr71.dll-a17.09.2005. u 00:07 - pre 226 meseci
Pokusavam vec neko vreme da kompajliram izvorni kod za sqlite. Kao jedan pd rezultata se dobija i sqlite3.dll. Medjutim, ovaj dll je zavisi od msvcr71.dll-a. Kompajliram ga koristeci sledeci makefile:
Code:

# VC++ 6.0 Makefile for SQLite 3.2.1

#### The toplevel directory of the source tree.  This is the directory
#    that contains this "Makefile.in" and the "configure.in" script.

TOP = ..\sqlite-3.2.1

#### C Compiler and options for use in building executables that
#    will run on the platform that is doing the build.

BCC = cl -Gs -GX -D_WIN32 -nologo -Zi

#### Leave MEMORY_DEBUG undefined for maximum speed.  Use MEMORY_DEBUG=1
#    to check for memory leaks.  Use MEMORY_DEBUG=2 to print a log of all
#    malloc()s and free()s in order to track down memory leaks.
#    
#    SQLite uses some expensive assert() statements in the inner loop.
#    You can make the library go almost twice as fast if you compile
#    with -DNDEBUG=1

#OPTS = -DMEMORY_DEBUG=2
#OPTS = -DMEMORY_DEBUG=1
#OPTS = 
OPTS = -DNDEBUG=1 -DSQLITE_OMIT_CURSOR=1

#### The suffix to add to executable files.  ".exe" for windows.
#    Nothing for unix.

EXE = .exe

#### C Compile and options for use in building executables that 
#    will run on the target platform.  This is usually the same
#    as BCC, unless you are cross-compiling.

TCC = cl -Gs -GX -D_WIN32 -nologo -Zi -DOS_WIN=1

# You should not have to change anything below this line
###############################################################################

# This is how we compile

TCCX = $(TCC) $(OPTS) -DWIN32=1 -DTHREADSAFE=1 -DOS_WIN=1 -DSQLITE_SOUNDEX=1 \
    -I. -I$(TOP)/src

TCCXD = $(TCCX) -D_DLL

# Object files for the SQLite library.

LIBOBJ = alter.obj attach.obj auth.obj btree.obj build.obj date.obj \
     delete.obj expr.obj func.obj hash.obj insert.obj \
     main.obj opcodes.obj os_win.obj pager.obj parse.obj \
     pragma.obj printf.obj random.obj select.obj table.obj \
     tokenize.obj trigger.obj update.obj util.obj vacuum.obj \
     vdbe.obj vdbeapi.obj vdbeaux.obj vdbemem.obj \
     where.obj utf.obj legacy.obj

# All of the source code files.

SRC = \
  $(TOP)/src/alter.c \
  $(TOP)/src/attach.c \
  $(TOP)/src/auth.c \
  $(TOP)/src/btree.c \
  $(TOP)/src/btree.h \
  $(TOP)/src/build.c \
  $(TOP)/src/date.c \
  $(TOP)/src/delete.c \
  $(TOP)/src/expr.c \
  $(TOP)/src/func.c \
  $(TOP)/src/hash.c \
  $(TOP)/src/hash.h \
  $(TOP)/src/insert.c \
  $(TOP)/src/legacy.c \
  $(TOP)/src/main.c \
  $(TOP)/src/os_win.c \
  $(TOP)/src/pager.c \
  $(TOP)/src/pager.h \
  $(TOP)/src/parse.y \
  $(TOP)/src/pragma.c \
  $(TOP)/src/printf.c \
  $(TOP)/src/random.c \
  $(TOP)/src/select.c \
  $(TOP)/src/shell.c \
  $(TOP)/src/sqlite.h.in \
  $(TOP)/src/sqliteInt.h \
  $(TOP)/src/table.c \
  $(TOP)/src/tokenize.c \
  $(TOP)/src/trigger.c \
  $(TOP)/src/utf.c \
  $(TOP)/src/update.c \
  $(TOP)/src/util.c \
  $(TOP)/src/vacuum.c \
  $(TOP)/src/vdbe.c \
  $(TOP)/src/vdbe.h \
  $(TOP)/src/vdbeapi.c \
  $(TOP)/src/vdbeaux.c \
  $(TOP)/src/vdbemem.c \
  $(TOP)/src/vdbeInt.h \
  $(TOP)/src/where.c

# Header files used by all library source files.

HDR = \
   sqlite3.h  \
   $(TOP)/src/btree.h \
   config.h \
   $(TOP)/src/hash.h \
   opcodes.h \
   $(TOP)/src/os.h \
   $(TOP)/src/os_common.h \
   $(TOP)/src/os_win.h \
   $(TOP)/src/sqliteInt.h  \
   $(TOP)/src/vdbe.h  \
   parse.h

# Header files used by the VDBE submodule

VDBEHDR = \
   $(HDR) \
   $(TOP)/src/vdbeInt.h

# This is the default Makefile target.  The objects listed here
# are what get build when you type just "make" with no arguments.

all:    sqlite3.h config.h sqlite3.dll libsqlite3.lib sqlite3.exe

sqlite3.dll:    $(LIBOBJ) $(TOP)/sqlite3.def
    echo #include "sqlite3.h" > version.c
    echo const char sqlite3_version[] = SQLITE_VERSION; >> version.c
    $(TCCX) -c version.c
    link -release -nodefaultlib -dll msvcrt.lib kernel32.lib \
        -def:$(TOP)\sqlite3.def -out:$@ $(LIBOBJ)
    lib sqlite3.lib version.obj

libsqlite3.lib:    $(LIBOBJ)
    lib -out:$@ $(LIBOBJ)

sqlite3.exe:    sqlite3.dll
    $(TCCX) -o $@ $(TOP)/src/shell.c sqlite3.lib

# Rules to build the LEMON compiler generator

lemon:    $(TOP)/tool/lemon.c $(TOP)/tool/lempar.c
    $(BCC) -o lemon $(TOP)/tool/lemon.c
    copy $(TOP)\tool\lempar.c .

keywordhash.h:    $(TOP)/tool/mkkeywordhash.c
    $(BCC) -o mkkwhash $(OPTS) $(TOP)/tool/mkkeywordhash.c
    .\mkkwhash > keywordhash.h

alter.obj:    $(TOP)/src/alter.c $(HDR)
    $(TCCXD) -c $(TOP)/src/alter.c

attach.obj:    $(TOP)/src/attach.c $(HDR)
    $(TCCXD) -c $(TOP)/src/attach.c

auth.obj:    $(TOP)/src/auth.c $(HDR)
    $(TCCXD) -c $(TOP)/src/auth.c

btree.obj:    $(TOP)/src/btree.c $(HDR) $(TOP)/src/pager.h
    $(TCCXD) -c $(TOP)/src/btree.c

build.obj:    $(TOP)/src/build.c $(HDR)
    $(TCCXD) -c $(TOP)/src/build.c

date.obj:    $(TOP)/src/date.c $(HDR)
    $(TCCXD) -c $(TOP)/src/date.c

delete.obj:    $(TOP)/src/delete.c $(HDR)
    $(TCCXD) -c $(TOP)/src/delete.c

expr.obj:    $(TOP)/src/expr.c $(HDR)
    $(TCCXD) -c $(TOP)/src/expr.c

func.obj:    $(TOP)/src/func.c $(HDR)
    $(TCCXD) -c $(TOP)/src/func.c

hash.obj:    $(TOP)/src/hash.c $(HDR)
    $(TCCXD) -c $(TOP)/src/hash.c

insert.obj:    $(TOP)/src/insert.c $(HDR)
    $(TCCXD) -c $(TOP)/src/insert.c

main.obj:    $(TOP)/src/main.c $(HDR)
    $(TCCXD) -c $(TOP)/src/main.c

opcodes.obj:    $(TOP)/opcodes.c $(HDR)
    $(TCCXD) -c $(TOP)/opcodes.c

os_win.obj:    $(TOP)/src/os_win.c $(HDR)
    $(TCCXD) -c $(TOP)/src/os_win.c

pager.obj:    $(TOP)/src/pager.c $(HDR) $(TOP)/src/pager.h
    $(TCCXD) -c $(TOP)/src/pager.c

parse.h:    parse.c

parse.obj:    parse.c $(HDR)
    $(TCCXD) -c parse.c

pragma.obj:    $(TOP)/src/pragma.c $(HDR)
    $(TCCXD) -c $(TOP)/src/pragma.c

parse.c:    $(TOP)/src/parse.y lemon
    copy $(TOP)\src\parse.y .
    .\lemon parse.y

printf.obj:    $(TOP)/src/printf.c $(HDR)
    $(TCCXD) -c $(TOP)/src/printf.c

random.obj:    $(TOP)/src/random.c $(HDR)
    $(TCCXD) -c $(TOP)/src/random.c

select.obj:    $(TOP)/src/select.c $(HDR)
    $(TCCXD) -c $(TOP)/src/select.c

table.obj:    $(TOP)/src/table.c $(HDR)
    $(TCCXD) -c $(TOP)/src/table.c

tokenize.obj:    $(TOP)/src/tokenize.c keywordhash.h $(HDR)
    $(TCCXD) -c $(TOP)/src/tokenize.c

trigger.obj:    $(TOP)/src/trigger.c $(HDR)
    $(TCCXD) -c $(TOP)/src/trigger.c

update.obj:    $(TOP)/src/update.c $(HDR)
    $(TCCXD) -c $(TOP)/src/update.c

util.obj:    $(TOP)/src/util.c $(HDR)
    $(TCCXD) -c $(TOP)/src/util.c

vacuum.obj:    $(TOP)/src/vacuum.c $(HDR)
    $(TCCXD) -c $(TOP)/src/vacuum.c

vdbe.obj:    $(TOP)/src/vdbe.c $(VDBEHDR)
    $(TCCXD) -c $(TOP)/src/vdbe.c

vdbeapi.obj:    $(TOP)/src/vdbeapi.c $(VDBEHDR)
    $(TCCXD) -c $(TOP)/src/vdbeapi.c

vdbeaux.obj:    $(TOP)/src/vdbeaux.c $(VDBEHDR)
    $(TCCXD) -c $(TOP)/src/vdbeaux.c

vdbemem.obj:    $(TOP)/src/vdbemem.c $(VDBEHDR)
    $(TCCXD) -c $(TOP)/src/vdbemem.c

where.obj:    $(TOP)/src/where.c $(HDR)
    $(TCCXD) -c $(TOP)/src/where.c

utf.obj:    $(TOP)/src/utf.c $(HDR)
    $(TCCXD) -c $(TOP)/src/utf.c

legacy.obj:    $(TOP)/src/legacy.c $(HDR)
    $(TCCXD) -c $(TOP)/src/legacy.c

sqlite3.h:    $(TOP)/src/sqlite.h.in
    ..\fixup < $(TOP)\src\sqlite.h.in > sqlite3.h \
        --VERS-- @$(TOP)\VERSION \
        --VERSION-NUMBER-- @@$(TOP)\VERSION

config.h:
    echo #include "stdio.h" >temp.c
    echo int main(){printf( >>temp.c
    echo "#define SQLITE_PTR_SZ %d\n",sizeof(char*)); >>temp.c
    echo exit(0);} >>temp.c
    $(BCC) -o temp temp.c
    .\temp >config.h
    @del temp.*

opcodes.h:    $(TOP)/src/vdbe.c parse.h
    ..\mkopc3 <$(TOP)/src/vdbe.c parse.h
    ..\fixup < opcodes.c > opcodes.new \
        sqliteOpcodeNames sqlite3OpcodeNames
    del opcodes.c
    ren opcodes.new opcodes.c

clean:
    del *.obj
    del *.pdb
    del *.dll
    del *.lib
    del *.exe
    del sqlite3.h
    del keywordhash.h
    del opcodes.h
    del opcodes.c
    del config.h
    del parse.h
    del parse.c

Pokusavao sam da izmenim ovak makefile da dobijem dll koji nece zavisiti od msvcr71.dll-a ali uzaludno. Probao sam razne kombinacije /MT /MD switch-eva i nekih direktiva ali onda ili nece da se kompajlira ili prodje ali opet je zavisan od ovog dll-a.

Jel zna iko sta i gde treba prepraviti?

PS: Pitanje mi se nije promenilo ali sam malo izmenio tekst jer sada vidim da sam pogresio kada sam govorio o dinamickom i statickom linkovanju. Dobijeni dll je uvek bio staticki linkovan za msvcr71.dll dok se dinamicki, valjda, moze postici zamo iz koda.

[Ovu poruku je menjao DarkMan dana 17.09.2005. u 10:34 GMT+1]
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..31.216.81.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: statičko linkovanje msvcr71.dll-a18.09.2005. u 11:14 - pre 226 meseci
Cim je .dll znaci da nije za staticko linkovanje... Ako bas hoces staticki da linkas, onda ne koristis msvcrt.lib, vec LIBCMT.LIB (fleg /MT)!

No, ne znam zasto bi to radio, jer sve masine poseduju MSVCRT, a takodje ti mozes da isporucis (imas pravo) MSVCRT (DLL) uz svoj program, ili biblioteku... Sto bi se mucio? Kompajliraj sqlite3.dll i uz nju (i eventualno uz program koji koristi sqlite3.dll) distribuiraj i potrebnu MSVCRTxx.DLL dinamicku biblioteku.

Dakle, liniju:
Code:

link -release -nodefaultlib -dll msvcrt.lib kernel32.lib -def:$(TOP)\sqlite3.def -out:$@ $(LIBOBJ)

treba da promenis u
Code:

link -release -nodefaultlib -dll libcmt.lib kernel32.lib -def:$(TOP)\sqlite3.def -out:$@ $(LIBOBJ)


SQLITE3.DLL ce se drasticno povecati.

Najbolja alternativa, u ovom slucaju je sledeca - nemoj uopste da bildas SQLITE3.DLL, vec uvuci SQLITE u svoj projekat (aplikaciju), i onda ceo program staticki linkaj. Dobices OGROMAN .exe koji nece zavisiti od puno biblioteka... Za one koji razmisljaju o licenci: SQLITE se bez problema moze koristiti na ovaj, gore navedeni, nacin i u komercijalnim projektima zatvorenog koda.

[Ovu poruku je menjao leka dana 18.09.2005. u 12:22 GMT+1]
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.neobee.net.

Jabber: DarkMan


Profil

icon Re: statičko linkovanje msvcr71.dll-a18.09.2005. u 19:59 - pre 226 meseci
Citat:
leka: No, ne znam zasto bi to radio, jer sve masine poseduju MSVCRT, a takodje ti mozes da isporucis (imas pravo) MSVCRT (DLL) uz svoj program, ili biblioteku... Sto bi se mucio? Kompajliraj sqlite3.dll i uz nju (i eventualno uz program koji koristi sqlite3.dll) distribuiraj i potrebnu MSVCRTxx.DLL dinamicku biblioteku.


To je jedna alternativa koja mi je trenutno jedina i dostupna. Mene trenutno bas interesuje kako da izvedem da dobijem dll koji nece zavisiti od msvcr71.dll-a. Nisam od onih koji tako lako odustaju kad nadju jedno resenje.

Citat:
leka: Najbolja alternativa, u ovom slucaju je sledeca - nemoj uopste da bildas SQLITE3.DLL, vec uvuci SQLITE u svoj projekat (aplikaciju), i onda ceo program staticki linkaj. Dobices OGROMAN .exe koji nece zavisiti od puno biblioteka... Za one koji razmisljaju o licenci: SQLITE se bez problema moze koristiti na ovaj, gore navedeni, nacin i u komercijalnim projektima zatvorenog koda.


Svestan sam te mogucnosti, ali ja sqlite koristim u javi tj. java wrapper za sqlite. E taj wrapper koristi sqlite_jni.dll koji koristi libsqlite3.lib (gore naveden mak fajl je jedna faza u kreiranju sqlite_jni.dll-a). Posto je rezultat kompajliranja takav da sqlite_jni.dll zavisi od msvcr71.dll-a mislio sam da ako saznam kako da se dobije sqlite3.dll da ne zavisi od msvcr71.dll-a onda cu isti princip primeniti i na sqlite_jni.dll.

Predlog koji si dao:
Code:

link -release -nodefaultlib -dll libcmt.lib kernel32.lib -def:$(TOP)\sqlite3.def -out:$@ $(LIBOBJ)

sam vec probao ranije (mada ga nisam naveo explicitno) i on je dovodio do greske u linkovanju:
Code:

    link -release -nodefaultlib -dll libcmt.lib kernel32.lib  -def:..\sqlite-3.2.1\sqlite3.def -out:sqlite3.dll alter.obj ... 
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

   Creating library sqlite3.lib and object sqlite3.exp
legacy.obj : warning LNK4049: locally defined symbol _isspace imported
alter.obj : warning LNK4217: locally defined symbol _isspace imported in function _sqlite3AlterFinishAddColumn
...
i tu ide gomila warning-a
...
vdbeaux.obj : error LNK2001: unresolved external symbol __imp__sprintf
func.obj : error LNK2001: unresolved external symbol __imp__sprintf
main.obj : error LNK2001: unresolved external symbol __imp__sprintf
os_win.obj : error LNK2001: unresolved external symbol __imp__sprintf
select.obj : error LNK2001: unresolved external symbol __imp__sprintf
btree.obj : error LNK2019: unresolved external symbol __imp__sprintf referenced in function _checkTreePage
build.obj : error LNK2001: unresolved external symbol __imp__sprintf
date.obj : error LNK2001: unresolved external symbol __imp__sprintf
expr.obj : error LNK2001: unresolved external symbol __imp__sprintf
build.obj : error LNK2001: unresolved external symbol __imp___iob
date.obj : error LNK2019: unresolved external symbol __imp__localtime referenced in function _localtimeOffset
func.obj : error LNK2019: unresolved external symbol __imp__toupper referenced in function _upperFunc
sqlite3.dll : fatal error LNK1120: 4 unresolved externals

Moja pretpostavka je da nije jedino u fazi linkovanja potrebna izmena vec treba nesto uraditi i u fazi kompajliranja. Koliko vidim prilikom kompajliranja vec je napravljen kod koji referencira msvcrt.lib. Probao sam u sledece dve linije da dodam swich /MT:
Code:

BCC = cl -Gs -GX -D_WIN32 -nologo -Zi /MT

i
Code:

TCC = cl -Gs -GX -D_WIN32 -nologo -Zi -DOS_WIN=1 /MT

plus onaj tvoj predlog ali isti error se pojavi.

Da li je moguce da zbog samog izvornog koda nije moguce ovo sto ja hocu?

[Ovu poruku je menjao DarkMan dana 18.09.2005. u 21:03 GMT+1]
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.neobee.net.

Jabber: DarkMan


Profil

icon Re: statičko linkovanje msvcr71.dll-a18.09.2005. u 20:13 - pre 226 meseci
Taman sto sam poslao zadnju poruku nesto mi privuce paznju. U temi http://www.elitesecurity.org/t...ike-razlike-velicine-exe-filea sam zapazio komentar:
Citat:
yooyo:MSVC po defaultu koristi DLL runtime (Single-Threaded-DLL ili Multi-Threaded-DLL). Mozes da podesis compiler tako da se koristi staticka runtime biblioteka (promeni u Single-Threaded ili Multi-Threaded bez DLL). 

Dok sam gledao sta razni svichevi rade video sam da /MT ustvari kreira direktivu _MT a svich /MD kreira _MT i _DLL. Posto sam vec vidjao u mak fajlu da se koristi direktiva _DLL moje je pretpostavka da je on odgovoran da rezultat zavisi od msvcr71.dll (i bio sam u pravu).

Uz zadrzane izmene iz prethodnog posta plus sledece izmena:
Code:

TCCXD = $(TCCX) -D_DLL

je zamenjeno sa:
Code:

TCCXD = $(TCCX)


Kompajliranje je bilo uspesno i rezultujuci fajl vise ne zavisi od msvcr71.dll (zavisi samo od kernela). Sam rezultat nije znacajno povecao svoju velicinu sa starih 304 KB je povecan na 348 KB.
 
Odgovor na temu

[es] :: C/C++ programiranje :: statičko linkovanje msvcr71.dll-a

[ Pregleda: 3364 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.