Помогите ламеру!
От: beck  
Дата: 03.08.02 20:27
Оценка:
Коротко о проблеме: имеется некий OBJ-файл, который скомпилирован в Borland C++ 5.0. В этом файле находится функция, которую мне нужно вызвать в другой программе на MS VC++ 6.0, для этого я включаю в проект OBJ-файл, объявляю вышеуказанную функцию внешней и пытаюсь ипользовать.
В итоге компилятор генерит (в OBJ-файле проекта) имя функции с учетом ее аргументов, линкер сообщает "unresolved external simbol", а я ломаю (сутки) голову о том как заставить компилятор генерить только имя.
Re: Помогите ламеру!
От: SergH Россия  
Дата: 03.08.02 21:10
Оценка: 1 (1)
Здравствуйте beck, Вы писали:

B>Коротко о проблеме: имеется некий OBJ-файл, который скомпилирован в Borland C++ 5.0. В этом файле находится функция, которую мне нужно вызвать в другой программе на MS VC++ 6.0, для этого я включаю в проект OBJ-файл, объявляю вышеуказанную функцию внешней и пытаюсь ипользовать.

B>В итоге компилятор генерит (в OBJ-файле проекта) имя функции с учетом ее аргументов, линкер сообщает "unresolved external simbol", а я ломаю (сутки) голову о том как заставить компилятор генерить только имя.

Поиграть с extern "C", _cdecl, __stdcall. Скорее всего хватит extern "C"
Делай что должно, и будь что будет
Re[2]: Помогите ламеру!
От: Аноним  
Дата: 03.08.02 22:28
Оценка:
Здравствуйте SergH, Вы писали:

SH>Поиграть с extern "C", _cdecl, __stdcall. Скорее всего хватит extern "C"


Не помогает, все равно что нибудь добавляется в имя (кстати мне нужен именно __stdcall), я еще забыл упомянуть о предупреждении линкера "warning LNK4033: converting object format from OMF to COFF" хотелось бы его убрать (если это возможно)
Re[3]: Помогите ламеру!
От: SergH Россия  
Дата: 04.08.02 11:08
Оценка:
Здравствуйте Аноним, Вы писали:

А>Не помогает, все равно что нибудь добавляется в имя (кстати мне нужен именно __stdcall), я еще забыл упомянуть о предупреждении линкера "warning LNK4033: converting object format from OMF to COFF" хотелось бы его убрать (если это возможно)


Можно попробовать что-нибудь с asm-ом замутить. Т.е. сделать функцию оболочку, которая просто вызывает нужную функцию через call имя_функции. Но тут я не большой специалист. Попробуй спросить в соотв. форуме.
Делай что должно, и будь что будет
Re[3]: Помогите ламеру!
От: SergH Россия  
Дата: 04.08.02 12:37
Оценка:
Здравствуйте Аноним, Вы писали:

А>Не помогает, все равно что нибудь добавляется в имя (кстати мне нужен именно __stdcall), я еще забыл упомянуть о предупреждении линкера "warning LNK4033: converting object format from OMF to COFF" хотелось бы его убрать (если это возможно)


Ещё одна идея. В dll можно написать что-то вроде:

#pragma comment(linker, "/export: MyFunc=_MyFunc@8")


и будет экспортировано две функции: MyFunc и _MyFunc@8. Может и здесь прокатит?
Делай что должно, и будь что будет
Re[4]: Помогите ламеру!
От: beck  
Дата: 04.08.02 20:29
Оценка:
Здравствуйте SergH, Вы писали:

SH>Ещё одна идея. В dll можно написать что-то вроде:


SH>
SH>#pragma comment(linker, "/export: MyFunc=_MyFunc@8")
SH>


SH>и будет экспортировано две функции: MyFunc и _MyFunc@8. Может и здесь прокатит?


Не прокатило в том числе и в различных вариациях.
Re[4]: Помогите ламеру!
От: beck  
Дата: 04.08.02 20:37
Оценка:
Здравствуйте SergH, Вы писали:

SH>Можно попробовать что-нибудь с asm-ом замутить. Т.е. сделать функцию оболочку, которая просто вызывает нужную функцию через call имя_функции. Но тут я не большой специалист. Попробуй спросить в соотв. форуме.


С асмом и медведь сможет . А если серьезно, должен быть какой нибудь способ, не обращаться же к асму каждый раз, как потребуется что нибудь в этом роде.
Re[5]: Помогите ламеру!
От: SergH Россия  
Дата: 04.08.02 22:06
Оценка:
Здравствуйте beck, Вы писали:

B>С асмом и медведь сможет . А если серьезно, должен быть какой нибудь способ, не обращаться же к асму каждый раз, как потребуется что нибудь в этом роде.


Хм. Вполне возможно, что когда тебу нужно смешать файлы от двух разных компиляторов без asm'а не обойтись. (У меня) далеко не каждый день встречается потребность.
Делай что должно, и будь что будет
Re[6]: Помогите ламеру!
От: beck  
Дата: 05.08.02 03:38
Оценка:
Здравствуйте SergH, Вы писали:

SH>Хм. Вполне возможно, что когда тебу нужно смешать файлы от двух разных компиляторов без asm'а не обойтись. (У меня) далеко не каждый ень встречается потребность.



Не думаю. Пакет Microsoft Visual Studio создавался для больших проектов, а когда большой проект никто не станет объявлять функции в одном компиляторе для того чтобы посмотреть какие имена он им даст, а потом присваивать их функциям в другом файле для другого омпилятора. И я не думаю что мелкомягкие программисты (какими криворукими они бы ни были) об этом не позаботились.
Re[7]: Помогите ламеру!
От: Vladik Россия  
Дата: 05.08.02 05:59
Оценка: 9 (1)
Здравствуйте beck, Вы писали:

SH>>Хм. Вполне возможно, что когда тебу нужно смешать файлы от двух разных компиляторов без asm'а не обойтись. (У меня) далеко не каждый ень встречается потребность.


Ребяты, я не понимаю ваших проблем Делаешь DLL — и вызываешь свою функцию хоть из VB. Сам в нескольких проектах это использовал — exe на Борланд Билдере, dll — на VC. Только для VC надо правильный .def файл написать, с явным указанием экспортируемых функций (чтобы он их имена не коверкал).

Что касается линковки с борландовским .obj — оставить надежду. Если и слинкуется, то все равно работать не будет Во всяком случае я о таком не слышал
Как все запущенно...
Re: Помогите ламеру!
От: Аноним  
Дата: 05.08.02 10:10
Оценка:
Здравствуйте beck, Вы писали:

B>Коротко о проблеме: имеется некий OBJ-файл, который скомпилирован в Borland C++ 5.0. В этом файле находится функция, которую мне нужно вызвать в другой программе на MS VC++ 6.0, для этого я включаю в проект OBJ-файл, объявляю вышеуказанную функцию внешней и пытаюсь ипользовать.

B>В итоге компилятор генерит (в OBJ-файле проекта) имя функции с учетом ее аргументов, линкер сообщает "unresolved external simbol", а я ломаю (сутки) голову о том как заставить компилятор генерить только имя.

Насколько я знаю, форматы OBJ файлов у разных компиляторов отличаются и не совместимы между собой
Re[8]: Помогите ламеру!
От: beck  
Дата: 05.08.02 17:18
Оценка:
Здравствуйте Vladik, Вы писали:

V>Ребяты, я не понимаю ваших проблем Делаешь DLL — и вызываешь свою функцию хоть из VB. Сам в нескольких проектах это использовал — exe на Борланд Билдере, dll — на VC. Только для VC надо правильный .def файл написать, с явным указанием экспортируемых функций (чтобы он их имена не коверкал).


V>Что касается линковки с борландовским .obj — оставить надежду. Если и слинкуется, то все равно работать не будет Во всяком случае я о таком не слышал


Может оно и так, но тогда зачем они предусмотрели конвертирование (судя по warning'гам от линкера) объектных файлов OMF-формата в COFF. Насколько я понимаю они OFM-форматом практически не пользуются, да и ихний masm функции (процедуры) не позволяет переопределять (а значит он генерирует просто имя), уж с ним то должно линковаться.

Что касается dll, то сделать я его скорее всего не смогу — у меня только объектные файлы (на самом деле их несколько, как и импортируемых функций), к тому же я их (dll) еще никогда не делал и мало представляю как с ними работать.

Есть правда одна идея — попробую "перебить" имена в объектном файле, если не выйдет, то облом .
Re[9]: Помогите ламеру!
От: Vladik Россия  
Дата: 05.08.02 20:02
Оценка:
Здравствуйте beck, Вы писали:

B>Может оно и так, но тогда зачем они предусмотрели конвертирование (судя по warning'гам от линкера) объектных файлов OMF-формата в COFF.


Вопрос такой конвертации несколько раз уже всплывал в различных конференциях. Как пояснил один человек (правда касательно борландовской утилиты конвертации), работает оно только для .lib "от dll'ok". И все равно криво Причем не понятно нафига оно надо, если учесть, что у борланда есть implib.exe, который из dll и так всегда сделает .lib.

B>Насколько я понимаю они OFM-форматом практически не пользуются, да и ихний masm функции (процедуры) не позволяет переопределять (а значит он генерирует просто имя), уж с ним то должно линковаться.


Просто у меня есть сильное подозрение, что все эти форматы даже при одинаковом названии имеют различную реализацию у различных фирм

B>Что касается dll, то сделать я его скорее всего не смогу — у меня только объектные файлы (на самом деле их несколько, как и импортируемых функций),


Дык, сделай dll борландом?!

B>к тому же я их (dll) еще никогда не делал и мало представляю как с ними работать.


Ну это уже на отмазку не тянет Делай dll и не мучайся. Вот только сделать .lib для VC для получившейся .dll не совсем тривиально (нет у VC аналога implib) — надо химичить с lib.exe, пусть знающие люди подскажут как именно. Но ты для начала получи dll, дальше уже фигня

B>Есть правда одна идея — попробую "перебить" имена в объектном файле, если не выйдет, то облом .


Попробуй, попробуй. Если получится — обязательно сообщи. Создашь прецедент совмещения бинарников M$ и борланда Повторюсь — я о таком еще не слышал
Как все запущенно...
Re[10]: Помогите ламеру!
От: beck  
Дата: 05.08.02 21:51
Оценка:
Здравствуйте Vladik, Вы писали:

V>Попробуй, попробуй. Если получится — обязательно сообщи. Создашь прецедент совмещения бинарников M$ и борланда :) Повторюсь — я о таком еще не слышал ;)


Все, полный абзац!:( Хотя изменение имени и прошло, но функция оказалась _fastcall (а не _stdcall как я думал раньше). Судя по всему у Борланда используются 3 регистра для быстрого вызова, тогда как у Майкрософта всего 2, так что, действительно, в этом случае работать не будет (похоже это касается только _fastcall и того случая когда имя функции короче 4 символов (надо добавлять "@16")).
Что касается Борланда, то dll, скорее всего, не получится по той же причине, к тому же я с ним не знаком (но сейчас появилась необходимость познакомиться :crash: )

(Этот абзац можно пропустить — я просто сетуюю :) )
Вызывает удивление, что это не предусмотрено стандартом, а если и предусмотрено, то его не придерживаются (правда я знаком со стандартом на С лишь в общих чертах, может тут допускаются варианты с количеством регистров). Да и программер создавший этот объектный файл тоже... :-\ экспортировать функцию быстрого вызова... М-да... А что делать программерам, скажем, на асме (не мне но другим)?! Дизассемблировать и смотреть?!
(здесь сетования закончились :) )

От всей души благодарю всех, кто принял участие в дискуссии (и моей беде).
Вопрос (для себя) пока оставлю открытым — вдруг у кого появятся соображения по этому поводу.
Re[2]: Помогите ламеру!
От: beck  
Дата: 05.08.02 21:56
Оценка:
Здравствуйте Аноним, Вы писали:

А>Насколько я знаю, форматы OBJ файлов у разных компиляторов отличаются и не совместимы между собой


Согласен, но линкер от MS конвертирует из OMF в COFF, а вообще см. Re[10]
Re[11]: Помогите ламеру!
От: Vladik Россия  
Дата: 05.08.02 22:33
Оценка:
Здравствуйте beck, Вы писали:

B> Все, полный абзац! Хотя изменение имени и прошло, но функция оказалась _fastcall (а не _stdcall как я думал раньше). Судя по всему у Борланда используются 3 регистра для быстрого вызова, тогда как у Майкрософта всего 2,


Кстати, у борланда какаим-то ключевым словом можно указать M$-фасткол

B>так что, действительно, в этом случае работать не будет (похоже это касается только _fastcall и того случая когда имя функции короче 4 символов (надо добавлять "@16")).

B> Что касается Борланда, то dll, скорее всего, не получится по той же причине,

По какой причине??? Делаешь .cpp, в котором определяешь экспортируемую функцию (extern "C"), из которой вызываешь свою фасткол, линкуешь все это со своим .obj, получаешь .dll, юзаешь ее из VC. Все

B>(Этот абзац можно пропустить — я просто сетуюю )

B> Вызывает удивление, что это не предусмотрено стандартом,

А нафига связывать разработчиков форматом бинарников??? У кого-то он более продвинутый, у кого-то менее...

B>а если и предусмотрено, то его не придерживаются (правда я знаком со стандартом на С лишь в общих чертах, может тут допускаются варианты с количеством регистров). Да и программер создавший этот объектный файл тоже... экспортировать функцию быстрого вызова...


Это уже, на самом деле, издержки дельфей и паскаля. Это оттудова пошел этот фастколл, там такой вызов используется "по умолчанию". Ну а борланд билдер, как известно, очень тесно завязан на дельфю.
Как все запущенно...
Re[5]: Помогите ламеру!
От: al Россия  
Дата: 06.08.02 08:49
Оценка:
Для того, чтобы в имени экспортируемой функции не было всяких @ и прочей ерунды, нужно указать ее имя в разделе
EXPORTS def-файла.


Re[12]: Помогите ламеру!
От: beck  
Дата: 07.08.02 03:16
Оценка:
Здравствуйте Vladik, Вы писали:

V>Кстати, у борланда какаим-то ключевым словом можно указать M$-фасткол


К сожалению для VC я в MSDN'е ничего похожего не нашел.

V>Делаешь .cpp, в котором определяешь экспортируемую функцию (extern "C"), из которой вызываешь свою фасткол, линкуешь все это со своим .obj, получаешь .dll, юзаешь ее из VC. Все


Если я правильно понял, ты предлагаешь создать (именно в билдере?) функцию-оболочку для импортируемой _fastcall фукнции и т.д.? А вот билдера-то у меня на данный момент и нету. (отвечать не надо это моя проблема)

V>А нафига связывать разработчиков форматом бинарников???


Говоря про стандарт я имел ввиду только фасткол, но на вопрос отвечает моя ситуация (это когда борланда нет, исходников на иморт нет, а по-человечески использовать ну очень хочется ). Если же ты имеешь ввиду альтернативу выбора компилера, то здесь ее еще меньше — тут получается либо то либо это, но не то и это одновременно (кроме dll (а здесь исключить фасткол )), а с одним OBJ-форматом на всех (как было раньше) все варианты одновременно и по отдельности. Тогда любым линкером можно компоновать бинарники с любого компилера любого языка. (вот это было бы )

V>У кого-то он более продвинутый, у кого-то менее...


Хотелось бы узнать что ты понимаешь под продвинутым и не очень — кажется каждый (борланд и MS) доволен своим форматом.

V>Это уже, на самом деле, издержки дельфей и паскаля. Это оттудова пошел этот фастколл, там такой вызов используется "по умолчанию". Ну а борланд билдер, как известно, очень тесно завязан на дельфю.


Тот программер мог бы догадаться. А вообще я не против фасткола, но хотелось бы чтоб он был у всех компилеров одинаковый.
Re[6]: Помогите ламеру!
От: beck  
Дата: 07.08.02 03:25
Оценка:
Здравствуйте al, Вы писали:

al>Для того, чтобы в имени экспортируемой функции не было всяких @ и прочей ерунды, нужно указать ее имя в разделе

al>EXPORTS def-файла.

Это надо было делать тому программеру (его же .obj).
Даже если он так бы и сделал, я все равно не смог бы "сказать" компилеру, чтобы он генерил func_name без @.
Re[6]: Помогите ламеру!
От: beck  
Дата: 07.08.02 03:27
Оценка:
P.S. см Re[10] от 06.08
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.