Article View: de.comp.lang.c++
Article #1034Re: HILFE: Probleme beim Linken mit mit WATCOM
From: Vitalik Polowinkin
Date: Mon, 18 Dec 1995 18:32
Date: Mon, 18 Dec 1995 18:32
94 lines
3326 bytes
3326 bytes
Tag, Mike !
-=> Quotes a message (4b3ebt$goc@pyrrhus-f.hrz.tu-chemnitz.de) in /de/comp/lang/c++
-=> from mis to at 18.12.95 10:04
> ich habe einige Probleme beim Konvertieren meiner Programme von Borland
> C++ nach Watcom C++. Besonders beim Liken von Assembler und C++ Moduln.
> Ein Beispiel [tut nichts, zeigt nur das Problem] :
> C++ : ********************************************************************
> * int VT;
> extern "C" ASM_Test (void);
mit 'extern "C"' muessen nicht nur Funktionen, sondern auch alle
Variablen deklariert werden, die mit den nicht-C++ Modulen gelinkt werden
muessen, also ein 'extern "C" VT' sollte es sein.
> void main (void)
> {
> ASM_Test ();
> }
>
> Assembler : **************************************************************
> * .386
> .model flat
>
> .code
> extrn VT:dword ; THIS DOES'NT WORK !!!!!!!!!!!!!!!!!!
> ; THE LINKER DOES'NT FOUND !!!!!!!!!!!
Versuch's mit 'extern _VT:dword'
> public ASM_Test_
> ASM_Test_ proc
> push ecx
> push ebp
> mov esp,ebp
> pop ebp
> pop ecx
> ret
> ASM_Test_ endp
> end
Falls Du spaeter die Argumente in Deine ASM-Routine uebergeben moechtest,
vergiss nicht, dass defaultmaessig die register call conventions wirksam
sind. Falls Du es bequemer (stack call convention) haben moechtest - '/4r'
oder '/5r' -Kommandozeilenoption angeben oder die ASM_Test-Deklaration in
C++ source mit '__cdecl' versehen.
> **************************************************************************
> ***** And that is what happens :
>
> wmake -f d:\watcom\programs\vesa\v16.mk -h -e
> wasm test.asm -i=d:\WATCOM\h -mf -5r -w4 -e25 -zq
> wpp386 ..\go.cpp -i=d:\WATCOM\h -w4 -e25 -zq -otexan -d2 -5r -bt=dos -mf
> wlink d all SYS dos4g op m op c op maxe=25 op q op symf @v16.lk1
> file test.obj(test.asm): undefined symbol VT
> Error(E42): Last command making (d:\watcom\programs\vesa\v16.exe) returned
> a bad status Error(E02): Make execution terminated
> Execution complete
>
>
> NUN das Problem : WARUM FINDET DER LINKER DIE IM C++ MODUL DEKLARIERTE
> VARIABLE 'VT' IM ASSEMBLERMODUL NICHT ???????????????? Unter BC
> funktioniert das ganze!
Weil die Regeln, nach denen die source-Namen fuer den Linker ergaenzt
werden, bei jedem Compiler anders sind.
Ein guter Tip: schau in die vom Linker erzeugte Map-Datei rein. 'OPTION
MAP', evtl. 'OPTION VERBOSE' aktivieren es. Suche nach Deinen Namen, wo er
definiert (public) und wo er deklariert (extern) ist - vieles wird auf
einmal klarer. Der Disassembler (wdisasm) kann auch oft helfen.
> Wenn jemand Rat weiss, dann immer her damit! Vielen Dank im Voraus!
-hiermit geschehen
> mis
>
> mis@informatik.tu-chemnitz.de
Ciao.
Vitalij.
Technical Details
Message-ID:
<5-5vA4u4eqB@uragan.go.sub.de>Path:
arc1-ca.pugleaf.net!uragan.go.sub.de!vitalikReferences:
<4b3ebt$goc@pyrrhus-f.hrz.tu-chemnitz.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!uragan.go.sub.de!vitalik Date: 18 Dec 1995 19:32:00 +0100 From: vitalik@uragan.go.sub.de (Vitalik Polowinkin) Newsgroups: de.comp.lang.c++ Message-ID: <5-5vA4u4eqB@uragan.go.sub.de> References: <4b3ebt$goc@pyrrhus-f.hrz.tu-chemnitz.de> Subject: Re: HILFE: Probleme beim Linken mit mit WATCOM X-Newsreader: CrossPoint v3.1 R/C7075 Organization: Vitalik's Compi, HaDiKo, Karlsruhe, D