OMF/COFF Borland C++/Visual C++

11 отговора 398 прегледа
#1

OMF/COFF Borland C++/Visual C++

Kompiliram C++ source s BCC32 5.5.1. Sled tova se opitvam da link-na obektniya fayl s link ot VC++ 6. Poluchavam slednoto syobshtenie za greshka:
fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

Sled malko rovene po Google i MSDN, razbiram slednoto:
Format na genriranite obektni faylove:
BCC: OMF
VC: COFF
No v MSDN pishe, che tehniya linker avtomatichno preobrazuva OMF v COFF predi link. T.e. ne bi tryabvalo da ima problem.

Ta vyrposyt e: kak da nakaram BCC 5.5.1 da generira takyv OMF, koyto da se haresa i na Microsoft-skiya linker?

Отговор
в отговор на Potencialen emigrant #2

Re: OMF/COFF Borland C++/Visual C++

тъй като си написал C++ (a не С) много е вероятно проблемът да произлиза от различният mangling на C++ имената в Borland C++ и VC++. (някое Borland-ско C++ име съдържа символ който е недопустим за име от гледна точка на MS, разните му там %, $ и @)

друг проблем за който се сещам, е за вътрешното представяне в obj файловете на имената на Windows фунциите - примерно при Borland е _DispatchMessageA, а във VC _DispatchMessageA@4 - и съответно MS линкер-а няма да може да го намери в неговия си MS-ски вариант на user32.lib (този проблем мисля че не може да се реши с alias, защото MS вече не допускат IMPORTS в DEF файла, за разлика от Borland).

идеята да дизасемблираш OMF файла и да го компилираш с masm /coff едва ли би се приела с въодушевление..

а какъв е този толкова специален C++ файл който трябва да компилираш с bcc и microsoft-ския компилатор не подхожда?

Отговор
в отговор на Potencialen emigrant #3

Re: OMF/COFF Borland C++/Visual C++

Имах подобен проблем и го реших, като си направих .DEF файл и след това с LIB.EXE (Microsoft) от .DEF и .DLL си спретнах COFF.

© 2002, All lefts reserved.
Отговор
в отговор на ®®® #4

Re: OMF/COFF Borland C++/Visual C++

останах с впечатление, че на човека му трябва да линк-не OMF OBJ файл, а не да прави (ms compatible) import library на DLL...

Отговор
в отговор на _ #5

Re: OMF/COFF Borland C++/Visual C++

Опссс....

© 2002, All lefts reserved.
Отговор
в отговор на _ #6

Re: OMF/COFF Borland C++/Visual C++

Problemyt e po-osnoven, do nenamereni simvoli oshte ne sym stignal.

> идеята да дизасемблираш OMF файла и да го компилираш с masm /coff едва ли би се приела с въодушевление..
Mi i az za tova si mislya. Po-tochno BCC vmesto .obj, da pravi .asm. Otkyde moga da si svalya masm?


Ami eto primer (realnoto e mnogo po-slojno, no se poluchava syshtiya efekt):

#include <iostream>
using namespace std;

namespace A
{
class ClassA
{
public:
virtual void f(void)
{
cerr << "::A::ClassA::f" << endl;
}
};
}

namespace B
{
typedef ::A::ClassA A_ClassA;

class ClassA : public ::A::ClassA
{
public:
virtual void f(void)
{
A_ClassA::f();
cerr << "::B::ClassB::f" << endl;
}
};
}

int main(int argc, char* argv[])
{
::A::ClassA *b = new ::B::ClassA;
b->f();
return 0;
}

Kopilray go s VC6 SP5 i pusni go da vidish kakvo stava. Ako ne e yasno kakvo tryabva da stane, preimenuvay B::ClassA na ClassB, da rechem.

Ne mi e problem da mina izcyalo na BCC, taka ili inache ne razrabotvam proekta pod Windows. Ama ot vreme na vreme VC debuggera vyrshi dobra rabota...

Отговор
в отговор на _ #7

Re: OMF/COFF Borland C++/Visual C++

> тъй като си написал C++ (a не С) много е вероятно проблемът да произлиза от различният mangling на C++ имената в Borland C++ и VC++. (някое Borland-ско C++ име съдържа символ който е недопустим за име от гледна точка на MS, разните му там %, $ и @)
Mnogo si prav, dagoyba :-( .obj, kompiliran ot C, se link-va s edin bezobiden warning...

Отговор
в отговор на Potencialen emigrant #8

Re: OMF/COFF Borland C++/Visual C++

nice stack overflow. :)

за MASM:
[линк]
(v6.14.8444) (мисля че от последното DDK за Win9x/ME)

ако имаш WinXP DDK - в него има - 7.00.9210.

по отношение на debugger-а - Borland нали дават безплатно и Turbo Debugger 5.5 (имах го даже тук някъде); за debug-ване на нормални приложни програми (с debug info) - според мен интегрирания debugger-a на MS няма кой знае какви предимства (изключвам разбира се Edit and Continue).

Отговор
в отговор на Potencialen emigrant #9

идея!

можеш да си инсталираш Intel C/C++ compiler.
напъхва се директно в IDE-то на Visual Studio-то (слага елемент в меню-то Select Compiler - дали Intel-ския или MS-ския), опции, debug-info всичко си му е MS compatible - красота!

примерчето който си пост-нал го компилира правилно! :)

и не на последно място, ще можеш да му се радваш на хищните оптимизации които прави, особено на floating point.

intel-ския компилатор 5.0.1 съм го upload-нал на [линк] - ако е още там (че нещо не мога да се конектна в момента)Ако не - на сайта на Intel има 30 дневен trial, но crack-ването, поне за 4.5 и 5.0, беше лесно; Или се обади тук във форума да измислим начин да ти го пратя.

Отговор
в отговор на _ #10

workaround

така се компилира правилно под Visual C++ 6 SP5


#include <iostream>
using namespace std;

namespace A
{
class ClassA
{
public:
virtual void f(void)
{
cerr << "::A::ClassA::f" << endl;
}
};
}

namespace B
{
class A_ClassA : public ::A::ClassA
{
};

class ClassA : public A_ClassA
{
public:
virtual void f(void)
{
A_ClassA::f();
cerr << "::B::ClassB::f" << endl;
}
};
}

int main(int argc, char* argv[])
{
::A::ClassA *b = new ::B::ClassA;
b->f();
return 0;
}


Отговор
в отговор на _ #11

Re: workaround

Ey, mnogo blagodarya za ideite :-)))

Отговор