/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Hvordan interfacer man moduler skrevet i B~
Fra : Jesper Wolf Jesperse~


Dato : 17-10-01 05:32

Vi er i gang med et større projekt hvor vi skal benytte nogle ting Lavet i
Borland C++ builder fra et Visual C++ projekt.

Jeg har forsøgt at lave en simpel objectfil udfra en C fil i Borland C++
builder, denne kunne jeg godt inkludere i et Visual C++ projekt og linke
med. Linkeren brokkede sig over at den skulle konvertere fra OMF til COFF
format, men programmet linkede og virkede.

Nu skulle jeg prøve at gøre det samme med et C++ modul fra Borland C++
builderen, men her har jeg ingen held. Linkeren vil ikke konvertere den
genererede objeckt fil til COFF og siger at objectfilen er invalid.

Jeg har forsøgt at slå enhver form for debug information fra, men microsofts
linker afviser stadigt objektfilen.

Er der nogen der har forslag til hvad man kan gøre ?
Er det lykkedes for nogen af jer at interface de to systemer ?


Hvis jeg ikke kan interface mellem de to systemer på dette niveau kan det
blive nødvendigt at lave en dll fil.
For at kunne bruge en dll skal man vel have en objektfil med information om
hvad der er i dll filen eller kan linkeren direkte bruge dll filen ?

Med venlig hilsen
Jesper Wolf Jespersen
--
+------------------------------+
| Jesper Wolf Jespersen |
| Energi Udvikling |
| CSC Consulting Group A(S |
| 14, Vesterlundsvej |
| DK-2730 Herlev |
| Denmark |
| Email: jwj@ehuset.com |
| Tel : +45 44 57 20 00 |
| Dir : +45 44 57 23 15 |
| Fax : +45 44 57 20 01 |
| Web : http://www.ehuset.com |
+------------------------------+



 
 
Mogens Hansen (17-10-2001)
Kommentar
Fra : Mogens Hansen


Dato : 17-10-01 07:48

Hej Jesper,
"Jesper Wolf Jespersen" <spam.jwj@ehuset.com.spam> wrote in message
news:wR7z7.2$8Z.330@news.get2net.dk...
> Vi er i gang med et større projekt hvor vi skal benytte nogle ting Lavet i
> Borland C++ builder fra et Visual C++ projekt.
>

Generelt:
Hvis vi snakker om source-kode er det blot at recompilere, hvis koden er
skrevet pænt (ISO C++ med passende afhængigheder).
Hvis vi snakker binært (f.eks. objekt-filer, DLL) kan det generelt ikke lade
sig gøre. Der findes naturligvis undertagelser herfra - primært DLL'er med
C-funktioner og WINAPI kaldekonvention samt COM-komponenter.

> Jeg har forsøgt at lave en simpel objectfil udfra en C fil i Borland C++
> builder, denne kunne jeg godt inkludere i et Visual C++ projekt og linke
> med. Linkeren brokkede sig over at den skulle konvertere fra OMF til COFF
> format, men programmet linkede og virkede.
>

Det er heldigt.

> Nu skulle jeg prøve at gøre det samme med et C++ modul fra Borland C++
> builderen, men her har jeg ingen held. Linkeren vil ikke konvertere den
> genererede objeckt fil til COFF og siger at objectfilen er invalid.
>

Det der mangler på MS-Windows platformen blandt C++ leverandører er et ABI -
Applikation Binary Interface.
C++ binært interface er langt mere kompleceret end C.
F.eks. hvordan håndteres exception, hvordan laves der name-mangling, hvilket
layout har vtable, hvordan håndteres multiple arv, hvad er størrelsen på
f.eks. "bool" og "long double" (sidstnævnte 10 på C++Builder og 8 på Visual
C++).

> Jeg har forsøgt at slå enhver form for debug information fra, men
microsofts
> linker afviser stadigt objektfilen.
>
> Er der nogen der har forslag til hvad man kan gøre ?
> Er det lykkedes for nogen af jer at interface de to systemer ?
>

Ja da. Ved hjælp af C++ sourcekode, DLL'er, COM og CORBA.
Det absolut nemmeste er at bruge C++ source-koden. Er der nogen grund til at
du ikke kan det ?
Hvis du har problemer med Visual C++ sprogimplementeringen kan du overveje
at bruge Intel C++ V5.0, som ser ud til at være langt bedre, og som er
(specificeret til at være) binær kompatibel med Visual C++.
Det næst nemmeste er at tage din C++ kode og lave den om til et DLL med
C-funktioner med WINAPI kaldekonvention.
COM og CORBA er unødigt kompliceret, hvis man ikke har brug for deres
egenskaber i øvrigt.

>
> Hvis jeg ikke kan interface mellem de to systemer på dette niveau kan det
> blive nødvendigt at lave en dll fil.

Ja.

> For at kunne bruge en dll skal man vel have en objektfil med information
om
> hvad der er i dll filen eller kan linkeren direkte bruge dll filen ?

Du skal blot linke import libraryet fra DLL med.
Begge compilere har værktøjer til at generere et import library ud fra et
DLL.
Til Borland C++Builder er det "implib.exe" og til Visual C++ er det linkeren


Venlig hilsen

Mogens Hansen



Jesper Wolf Jesperse~ (17-10-2001)
Kommentar
Fra : Jesper Wolf Jesperse~


Dato : 17-10-01 09:04

Hej Mogens.

> > Vi er i gang med et større projekt hvor vi skal benytte nogle ting Lavet
i
> > Borland C++ builder fra et Visual C++ projekt.


> Det der mangler på MS-Windows platformen blandt C++ leverandører er et
ABI -
> Applikation Binary Interface.
> C++ binært interface er langt mere kompleceret end C.
> F.eks. hvordan håndteres exception, hvordan laves der name-mangling,
hvilket
> layout har vtable, hvordan håndteres multiple arv, hvad er størrelsen på
> f.eks. "bool" og "long double" (sidstnævnte 10 på C++Builder og 8 på
Visual
> C++).

Jeg er bange for at du benytter et forkert ord, selv om du sansynligvis
mener noget rigtigt
Et ABI er et binært interface til operativsystemet !!.
De ABI'er der er lavet i Unix sammenhæng er f.eks. MIPS ABI skulle sørge for
at man kan flytte sin applikation fra en MIPS Unix til en anden MIPS Unix
uden at gå via kildeteksten.
Denne kompatibilitet har vi på Windows sammenhæng, WIN32 kode kan køres på
alt fra Windows-95 til Windows-XP og Windows2000, selvfølgeligt er der
forskelle på hvilket subset de forskellige afarter supporterer, men det er
der også under de andre ABI'er.

Det der er problemet her er forskellige filformater i objekt og lib filer,
forskellig name mangling i forbindelse med C++ og endeligt forskellig måde
at gemme debug informationen i objektfilen.
Disse problemer har såmænd også udbredelse udenfor Windows verdenen, COFF,
ELF, a.out, OMF og så videre er alle begreber der blandt andet er kendt fra
linux.

> > Jeg har forsøgt at slå enhver form for debug information fra, men
microsofts
> > linker afviser stadigt objektfilen.

> > Er der nogen der har forslag til hvad man kan gøre ?
> > Er det lykkedes for nogen af jer at interface de to systemer ?

> Ja da. Ved hjælp af C++ sourcekode, DLL'er, COM og CORBA.
> Det absolut nemmeste er at bruge C++ source-koden. Er der nogen grund til
at
> du ikke kan det ?

Det drejer sig om et tredieparts produkt der interfacer med borland C++
builder. Produktet hedder DOA (Direct Oracle Access) og genererer Delphi
klasser ud fra database pakker, ligesom der er et Delphi baseret interface
til databasen.
Delphi kode kan håndteres direkte af C++ builderen, men C++ builderen er
vist så langt fra at være en standard C++ som man kan komme.
Mange af udvidelserne er smarte set ud fra produktivitetskriterier, men der
er meget nyt at lære hvis man vælger at gøre alt i C++ builderen, ligesom
man så er låst til dette produkt for tid og evighed. Ikke kun vil den kode
man skriver kun kunne køre her, men for eksempel exception håndtering er en
noget anden affære i borlands compiler end i andre C++ implementationer, så
programøren kommer til at tænke i borland termer og vil have svært ved at
hoppe frem og tilbage mellem værktøjerne.

Afdelingens andre produkter er skrevet i Visual C/C++ og holder sig meget
tæt op af standarden for portabilitet, vi kan godt acceptere at enkelte
moduler af projektet laves i andre værktøjer hvis der er en produktivitets
gevindst ved at gøre det. Hvis skidtet skal porteres til en anden platform
kan disse moduler omskrives på den anden platform.

Modulerne her er basale database tilgangsrutiner som vi før har skrevet i
Oracle Pro*C, men hvis vi kan mobilisere mulighederne i DOA uden at det
bliver alt for bøvlet så ville det være dejligt.


> Hvis du har problemer med Visual C++ sprogimplementeringen kan du overveje
> at bruge Intel C++ V5.0, som ser ud til at være langt bedre, og som er
> (specificeret til at være) binær kompatibel med Visual C++.

Jeg har aldrig helt fattet hvorfor Borland opfandt sine egne fil formater.
Der er gået Hejlsberg i lortet


> > Hvis jeg ikke kan interface mellem de to systemer på dette niveau kan
det
> > blive nødvendigt at lave en dll fil.
>
> Ja.
>
> > For at kunne bruge en dll skal man vel have en objektfil med information
om
> > hvad der er i dll filen eller kan linkeren direkte bruge dll filen ?
>
> Du skal blot linke import libraryet fra DLL med.
> Begge compilere har værktøjer til at generere et import library ud fra et
DLL.
> Til Borland C++Builder er det "implib.exe" og til Visual C++ er det
linkeren

Tak skal du have for den information, så er det bare med at finde de rigtige
reserverede ord og pragmaer at putte i en header fil der definerer
kaldeinterfacet så de to compilere er enige

Jeg vil stadigt meget gerne høre fra folk der har praktiske erfaringer med
at linke Borland objekter ind i Visual C applikationer.


Med venlig hilsen

Jesper Wolf jespersen




Mogens Hansen (17-10-2001)
Kommentar
Fra : Mogens Hansen


Dato : 17-10-01 09:37


"Jesper Wolf Jespersen" <spam.jwj@ehuset.com.spam> wrote in message
news:ZXaz7.28$8Z.951@news.get2net.dk...
>
> Jeg er bange for at du benytter et forkert ord, selv om du sansynligvis
> mener noget rigtigt
> Et ABI er et binært interface til operativsystemet !!.

Nej, det du snakker om er et API - Application Programming Interface.

Hvis du er i tvivl om at jeg har ret så se f.eks.

http://developer.intel.com/design/Itanium/Downloads/245370.htm

eller kig i noget af dokumentationen til gcc

> Denne kompatibilitet har vi på Windows sammenhæng, WIN32 kode kan køres på
> alt fra Windows-95 til Windows-XP og Windows2000, selvfølgeligt er der
> forskelle på hvilket subset de forskellige afarter supporterer, men det er
> der også under de andre ABI'er.
>

Nej, det hedder Win32 API.

> Det der er problemet her er forskellige filformater i objekt og lib filer,
> forskellig name mangling i forbindelse med C++ og endeligt forskellig måde
> at gemme debug informationen i objektfilen.
> Disse problemer har såmænd også udbredelse udenfor Windows verdenen, COFF,
> ELF, a.out, OMF og så videre er alle begreber der blandt andet er kendt
fra
> linux.
>

Nej, som jeg sagde, er der langt flere problemer en filformatet og
name-mangling.
Når f.eks. "long double" har forskellige størrelser mellem compilere,
hvordan skal de så kunne blive kompatible ?
Der er ingen grund til at tro at dit binære layout for f.eks. "std::string",
"std::map" eller "std::ofstream" er identisk mellem Borland C++Builder (som
bruger RougeWave implementation) og Microsoft Visual C++ (som bruger
Dinkumware implementation).

Jeg sagde jo at jeg har været der!

>
> Det drejer sig om et tredieparts produkt der interfacer med borland C++
> builder. Produktet hedder DOA (Direct Oracle Access) og genererer Delphi
> klasser ud fra database pakker, ligesom der er et Delphi baseret interface
> til databasen.

Ok.
Den typiske måde som jeg gør det, er at skrive et mellem DLL med et
C-funktions interface med WINAPI kaldekonvention, med den compiler som
tredieparts produktet understøtter, og så bruge det (via et source-kode
interface, der svarer til det oprindelige tredieparts produkts interface) i
den anden compiler.
Det er ikke så svært.

> Delphi kode kan håndteres direkte af C++ builderen, men C++ builderen er
> vist så langt fra at være en standard C++ som man kan komme.

Det er objektivt forkert.
Det er rigtigt at VCL benytter sprogudvidelser, og at der bruges
sprogudvidelser til at interface Delphi og C++Builder.

> Mange af udvidelserne er smarte set ud fra produktivitetskriterier, men
der
> er meget nyt at lære hvis man vælger at gøre alt i C++ builderen, ligesom
> man så er låst til dette produkt for tid og evighed. Ikke kun vil den kode
> man skriver kun kunne køre her, men for eksempel exception håndtering er
en
> noget anden affære i borlands compiler end i andre C++ implementationer,

> programøren kommer til at tænke i borland termer og vil have svært ved at
> hoppe frem og tilbage mellem værktøjerne.

Der er fuld understøttelse for ISO C++ exceptions.
Desuden er der understøttelse for Windows structured exception og exception
som er compatible med Delphi.
Hvad mere kan man ønske ?

Det er programmørens ansvar at bruge de features som man ønsker.

Den væsentligste del af min kode er bestemt ikke låst til C++Builder, selv
om det er min primære compiler.
Mit primære programmeringssprog er ISO C++.

>
> Afdelingens andre produkter er skrevet i Visual C/C++ og holder sig meget
> tæt op af standarden for portabilitet, vi kan godt acceptere at enkelte
> moduler af projektet laves i andre værktøjer hvis der er en produktivitets
> gevindst ved at gøre det. Hvis skidtet skal porteres til en anden platform
> kan disse moduler omskrives på den anden platform.

Jeg har normalt ingen problemer med at skrive ISO C++ i C++Builder (lang
færre end når jeg bruger Visual C++).
Min kode kan typisk frit flyttes mellem til f.eks. Visual C++, Intel C++ og
gcc.
VCL baseret kode kan ikke flyttes til andre compilere.

Hvis din afdelings kode er skrevet meget tæt på C++ Standarden, burde det
ikke give nævneværdige problemer at compilere det med C++Builder.

>
> Modulerne her er basale database tilgangsrutiner som vi før har skrevet i
> Oracle Pro*C, men hvis vi kan mobilisere mulighederne i DOA uden at det
> bliver alt for bøvlet så ville det være dejligt.
>

Det er muligt.

>
> Jeg har aldrig helt fattet hvorfor Borland opfandt sine egne fil formater.
> Der er gået Hejlsberg i lortet
>

Det primære problem er ikke filformatet. Men det har jeg allerede sagt.

>
> > > Hvis jeg ikke kan interface mellem de to systemer på dette niveau kan
> det
> > > blive nødvendigt at lave en dll fil.
> >
> > Ja.
> >
> > > For at kunne bruge en dll skal man vel have en objektfil med
information
> om
> > > hvad der er i dll filen eller kan linkeren direkte bruge dll filen ?
> >
> > Du skal blot linke import libraryet fra DLL med.
> > Begge compilere har værktøjer til at generere et import library ud fra
et
> DLL.
> > Til Borland C++Builder er det "implib.exe" og til Visual C++ er det
> linkeren
>
> Tak skal du have for den information, så er det bare med at finde de
rigtige
> reserverede ord og pragmaer at putte i en header fil der definerer
> kaldeinterfacet så de to compilere er enige

Som jeg siger

>
> Jeg vil stadigt meget gerne høre fra folk der har praktiske erfaringer med
> at linke Borland objekter ind i Visual C applikationer.
>

Du er velkommen til at _tro_ at jeg ikke har _praktisk_ erfaring!

Venlig hilsen

Mogens Hansen



Jesper Wolf Jesperse~ (17-10-2001)
Kommentar
Fra : Jesper Wolf Jesperse~


Dato : 17-10-01 11:01

> > Jeg er bange for at du benytter et forkert ord, selv om du sansynligvis
> > mener noget rigtigt
> > Et ABI er et binært interface til operativsystemet !!.
>
> Nej, det du snakker om er et API - Application Programming Interface.

Et API er noget der kan tilgås fra kildetekster, for eksempel standard C
bibliotekerne. et ABI kan tilgås af det oversatte program uden genlinkning.
et Aplication Programmers Interface er mest relevant for programøren, et
Applications Binary interface er også relevant for brugeren.

Prøv lige at kigge på denne side http://www.metrolink.com/abi/

Det at du kan flytte et windows program fra en maskine der kører Windows 95
til en der kører Windows2000 og har en god chance for at det stadigt virker
betyder at de to platforme er binært kompatible. (med begrænsninger
selvfølgeligt)
Det kan meget vel være at Microsoft aldrig har udråbt Windows platformen som
en Windows ABI platform, men al ABI snakken blandt unix folk er jo netop et
modtræk mod Windows dominans.
Hvis de kun havde haft et API tilfælles skulle programmet genoversættes og
genlinkes for at kunne køre på den anden platform, det er forskellen mellem
et Binært Interface og et Programmør Interface.

> Hvis du er i tvivl om at jeg har ret så se f.eks.
>
> http://developer.intel.com/design/Itanium/Downloads/245370.htm
>
> eller kig i noget af dokumentationen til gcc

Jeg kan ikke tilgå denne side så desværre aner jeg ikke hvad den drejer sig
om.
At GCC snakker om API'er er jo ikke mærkeligt, det er et compiler system som
skal rumme biblioteksrutinerne der oversætter fra standard bibliotekernes
API til målplatformen, deriblandt stiller de jo som regel også
målplatformens API til rådighed for programmøren.

Jeg er ikke ude på at kløve hår i denne sammenhæng, og jeg har aldrig haft
til formål at fornærme dig. Hvis du opfatter mit indlæg som et angreb må du
undskylde.

Du har ret i at der ud over filformatet også er spørgsmål om dataformater,
men det kan sansynligvis løses ved at vælge kompatible typer istedet for at
opsøge problemtyperne..

Jeg har på forhånd opgivet at få C++ med fra den ene compiler til den anden
da der er alt for stor forskel på de valg de har truffet.

Men jeg havde egenligt håbet på at kunne skrive C rutiner i en C++ fil og så
kunne oversætte og linke resultatet med Visual C, det ser blot ikke ud til
at være muligt blandt andet fordi Microsofts linker ikke kan lide Borlands
filformater.
(Der er sikkert også meget andet galt, men dem kunne man måske kigge på hvis
filformat problemet kunne løses).

Grunden til at jeg ikke er borland tilhænger er at jeg før er blevet fanget
af Borlandismer når jeg skulle bruge tingene på andre platforme, det har
været tilfældet med Turbo-Pascal 5 => VAX Pascal og Turbo C++ 2=> Gnu C++,
produkterne kan være gode nok, men de vaner man får af at bruge dem kan være
svære at komme af med og det er et problem når folk skal læres op, for de
vil være fristet til at benytte shortcuts også selv om de får at vide at de
ikke må. (Vi prøver sku der er nok ikke nogen der checker)

Og så har jeg aldrig været ude på at fornærme din praktiske erfaring, jeg
villle blot invitere andre til også at give deres besyv med.

Med venlig hilsen
Jesper Wolf Jespersen




Mogens Hansen (17-10-2001)
Kommentar
Fra : Mogens Hansen


Dato : 17-10-01 12:18


"Jesper Wolf Jespersen" <spam.jwj@ehuset.com.spam> wrote in message
news:JFcz7.150$8Z.1766@news.get2net.dk...
> > > Jeg er bange for at du benytter et forkert ord, selv om du
sansynligvis
> > > mener noget rigtigt
> > > Et ABI er et binært interface til operativsystemet !!.
> >
> > Nej, det du snakker om er et API - Application Programming Interface.
>
> Et API er noget der kan tilgås fra kildetekster, for eksempel standard C
> bibliotekerne. et ABI kan tilgås af det oversatte program uden
genlinkning.
> et Aplication Programmers Interface er mest relevant for programøren, et
> Applications Binary interface er også relevant for brugeren.
>

Rigtigt.
Men hvis C++ kode skal kunne bruges binært på tværs af compilere, så kræves
det at en lang række ting som størrelsen af "bool" og "long double",
udlægget af vtable, håndteringen af exception, udlægget af klasser med
multiple arv etc. er specificeret.
Det må påvirkes af både CPU arkitektur, operativsystem og
programmeringssprog.
Det er mit indtryk at både gcc og Intel Itanium har gjort væsentlige
fremskridt på dette område.
En sådan specifikation findes ikke til MS-Windows.


>
> Jeg kan ikke tilgå denne side så desværre aner jeg ikke hvad den drejer
sig
> om.
> At GCC snakker om API'er er jo ikke mærkeligt, det er et compiler system
som
> skal rumme biblioteksrutinerne der oversætter fra standard bibliotekernes
> API til målplatformen, deriblandt stiller de jo som regel også
> målplatformens API til rådighed for programmøren.
>

Nej, gcc snakker om ABI.
F.eks. er der, så vidt jeg ved, blevet lavet om på hvordan exceptions
håndteres binært i gcc 3.0.

>
> Du har ret i at der ud over filformatet også er spørgsmål om dataformater,
> men det kan sansynligvis løses ved at vælge kompatible typer istedet for
at
> opsøge problemtyperne..

Ja, Windows API er et eksempel på det.
Men der snakker vi stadig C-funktioner og WINAPI kaldekonvention.
Det er helt anderledes, når vi snakker C++.

>
> Jeg har på forhånd opgivet at få C++ med fra den ene compiler til den
anden
> da der er alt for stor forskel på de valg de har truffet.
>

Det tror jeg er fornuftigt.

> Men jeg havde egenligt håbet på at kunne skrive C rutiner i en C++ fil og

> kunne oversætte og linke resultatet med Visual C, det ser blot ikke ud til
> at være muligt blandt andet fordi Microsofts linker ikke kan lide Borlands
> filformater.

Det kan man ved hjælp af et mellem DLL, lavet med den ene compiler og brugt
fra den anden.

>
> Grunden til at jeg ikke er borland tilhænger er at jeg før er blevet
fanget
> af Borlandismer når jeg skulle bruge tingene på andre platforme, det har
> været tilfældet med Turbo-Pascal 5 => VAX Pascal og Turbo C++ 2=> Gnu
C++,
> produkterne kan være gode nok, men de vaner man får af at bruge dem kan
være
> svære at komme af med og det er et problem når folk skal læres op, for de
> vil være fristet til at benytte shortcuts også selv om de får at vide at
de
> ikke må. (Vi prøver sku der er nok ikke nogen der checker)
>

Hvem bestemmer standarden for f.eks. Pascal ?

Hvem bestemte C++ standarden da Turbo C++ 2 var aktuel ?
ARM var vel det tætteste på en standard man kunne komme.

I dag er vi langt bedre stillet med en ISO C++ standard, så har vi en
reference.

Man skal altid være opmærksom på at man afhænger af sine afhængigheder.
Det være sig værktøjer, compiler eller platform.
Det kræver måske erfaring at vide hvor vigtigt det er.
Det kræver også at et projekts prioriteter er klare: skal det være
portabelt, i hvilken udstrækning, også hvis det tager længere tid at udvikle
?
Personligt tager jeg det meget alvorligt, ikke at gøre mig afhængig af en
specifik compiler, uden at jeg får meget væsentlige fordele og jeg er klar
over valget.


Venlig hilsen

Mogens Hansen



Ivan Johansen (21-10-2001)
Kommentar
Fra : Ivan Johansen


Dato : 21-10-01 18:17

Mogens Hansen wrote:

> Hvem bestemmer standarden for f.eks. Pascal ?

Måske ISO 7185:1990 standarden.



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste