Линковка obj-ей.

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
SeRRg
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 343
Зарегистрирован: 25.11.2003 (Вт) 20:14
Откуда: Тюмень!

Линковка obj-ей.

Сообщение SeRRg » 07.09.2004 (Вт) 14:15

Помогите, кто чем может.

Мне по информатике препод сказал дома узнать и посмотреть, можно ли слинковывать obj - файлы, получающиеся
на предв. этапе обработки в Различных ЯП (н-р, VB, Pascal, C++, Asm). И принести ему рабочий пример на Делфи.
Пример я не прошу (хотя если кто-нить сделает, против не буду :wink: ), просто не могли бы вы теоретический аспект немного разъяснить или хотя бы ссылку дать какую-нибудь. ?
VB - это звучит!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.09.2004 (Вт) 17:05

Вопрос лишь в том, какие форматы понимает линковщик и какие производит компилятор. Непосредственно от языка это вообще не зависит, насколько я знаю :)
Например, если obj в формате COFF, то, по идее, пофигу, на каком языке он писан :roll: И если таковых obj несколько, то любой линковщик, понимающий COFF, их слинкует.
Имхо.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 07.09.2004 (Вт) 19:32

:) Возьми нормальный "линковщик" и вызывай его через командную строку :) Простота ;)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

SeRRg
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 343
Зарегистрирован: 25.11.2003 (Вт) 20:14
Откуда: Тюмень!

Сообщение SeRRg » 07.09.2004 (Вт) 19:37

Нет, беда не в том, чтобы слинковать.. Это я могу. Дело в другом: Допустим, я создал в VB функцию, ну, скажем,

Public Function mmm()
MsgBox "sss"
End Function

(или подпрограмму) Как мне построить файл cpp консольного приложения в VC++, чтобы его obj при линковке
с obj'ем этого модуля давал желаемый результат (чтобы из Си вызывалась функция VB)???
VB - это звучит!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.09.2004 (Вт) 19:42

Эээ....
Видимо, нужно эту функцию описать как external в C, а линкер уже разберётся по имени...
А чтобы получить obj от VB, тебе придётся сделать так (во всяком случае, я так делал :)): подменить файл link.exe на заглушку, которая копирует все obj из своей командной строки куда-нибудь далеко, а то VB имеет нехорошую привычку их очень быстро удалять :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 09.09.2004 (Чт) 17:53

Ну почему же, можно заменять и нормальным link.bat, который копирует файлы перед линковкой и линкует их в другом месте.
А вот на счет линковки модуля VB и CPP - очень сомневаюсь. Да и как оно будет работать? Ты подумай, это совмещение двух разных вещей.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.09.2004 (Чт) 17:54

Всё, пошёл пробовать...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.09.2004 (Чт) 18:46

Ага, вот я и вернулся :) Сообщаю.

VS6 распознал переданный через командную строку obj, созданный в VB. Только вот по дефолту extern int __stdcall VBFunction(int, int) компилятор преобразует в ... в общем, меняет имя, как и всегда :), и вот это новое имя не совпадает с изменённым именем этой функции в VB-obj, поэтому и получается один неразрешённый внешний.
Кстати, сначала таковых было два, поскольку obj №1 ещё ссылался на функцию проверки переполнения. Когда добавил в командную строку VC ссылки на Project1.obj и VBAEXE6.lib, функция переполнения успешно разрешилась.

Вывод: линковка возможна в принципе. Нужно только понять, как избежать несоответствия изменённых имён :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Zer
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 460
Зарегистрирован: 26.09.2003 (Пт) 13:08
Откуда: Нижний Новгород

Сообщение Zer » 09.09.2004 (Чт) 22:53

А не у кого нет линка для a86? А то по-моему он без лицензии не распростроняется в отличии от самого a86.
Microsoft DirectX - Маломягкий Прямой Х...
Не откладывай на завтра то, что можно выпить сегодня...

SeRRg
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 343
Зарегистрирован: 25.11.2003 (Вт) 20:14
Откуда: Тюмень!

Сообщение SeRRg » 12.09.2004 (Вс) 10:02

Спасибо за исследование. У меня почти так же получилось (в смысле-ничего не получилось :)) Тогда еще один вопрос: все ли компиляторы меняют названия функций???
VB - это звучит!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.09.2004 (Вс) 13:41

SeRRg писал(а):Спасибо за исследование. У меня почти так же получилось (в смысле-ничего не получилось :)) Тогда еще один вопрос: все ли компиляторы меняют названия функций???
http://weblogs.asp.net/oldnewthing/archive/2004/01/08/48616.aspx
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.09.2004 (Вс) 16:08

А раз так, может, нужно как-то уточнить определение extern в C? dllimport вставить или ещё чего...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.09.2004 (Вс) 16:21

Эге...

extern int __stdcall VBFunction(int p1, int p2); :arrow: ?VBFunction@@YGHHH@Z

extern int __declspec(dllimport) __stdcall VBFunction(int p1, int p2); :arrow: __imp_?VBFunction@@YGHHH@Z

А в VBHeader.obj содержится ?VBFunction@VBHeader@@AAGXXZ
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.09.2004 (Вс) 17:04

Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation 1981-2001. All rights reserved.

Undecoration of :- "?VBFunction@@YGHHH@Z"
is :- "int __stdcall VBFunction(int,int)"


Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation 1981-2001. All rights reserved.

Undecoration of :- "?VBFunction@VBHeader@@AAGXXZ"
is :- "private: void __stdcall VBHeader::VBFunction(void)"
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.09.2004 (Вс) 17:13

Гы.
А ведь функция-то в модуле! И она определённо long.

Вот от меня пара ссылок:
http://www.heaventools.com/unmangle.htm
http://www.digitalmars.com/ctg/ctgMixingLanguages.html


А функция, кстати,
Код: Выделить всё
Public Function VBFunction(ByVal p1 As Long, ByVal p2 As Long) As Long
  VBFunction = p1 + p2
End Function



ЗЫ: вторая ссылка - хороший ответ преподу на его вопрос :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

SeRRg
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 343
Зарегистрирован: 25.11.2003 (Вт) 20:14
Откуда: Тюмень!

Сообщение SeRRg » 16.09.2004 (Чт) 17:23

СПАСИБО. Буду теперь читать :)
VB - это звучит!


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList