OMF/COFF Borland C++/Visual C++
11 отговора
398 прегледа
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?
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?
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-ския компилатор не подхожда?
друг проблем за който се сещам, е за вътрешното представяне в obj файловете на имената на Windows фунциите - примерно при Borland е _DispatchMessageA, а във VC _DispatchMessageA@4 - и съответно MS линкер-а няма да може да го намери в неговия си MS-ски вариант на user32.lib (този проблем мисля че не може да се реши с alias, защото MS вече не допускат IMPORTS в DEF файла, за разлика от Borland).
идеята да дизасемблираш OMF файла и да го компилираш с masm /coff едва ли би се приела с въодушевление..
а какъв е този толкова специален C++ файл който трябва да компилираш с bcc и microsoft-ския компилатор не подхожда?
Re: OMF/COFF Borland C++/Visual C++
Имах подобен проблем и го реших, като си направих .DEF файл и след това с LIB.EXE (Microsoft) от .DEF и .DLL си спретнах COFF.
© 2002, All lefts reserved.
© 2002, All lefts reserved.
Re: OMF/COFF Borland C++/Visual C++
останах с впечатление, че на човека му трябва да линк-не OMF OBJ файл, а не да прави (ms compatible) import library на DLL...
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...
> идеята да дизасемблираш 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...
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...
Mnogo si prav, dagoyba :-( .obj, kompiliran ot C, se link-va s edin bezobiden warning...
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).
за 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).
идея!
можеш да си инсталираш 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, беше лесно; Или се обади тук във форума да измислим начин да ти го пратя.
напъхва се директно в 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, беше лесно; Или се обади тук във форума да измислим начин да ти го пратя.
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;
}
Re: OMF/COFF Borland C++/Visual C++
S VC7 e OK, taka che moje i s nego da si kompilirash