Сейчас на форуме: jinoweb, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Написать хедер для ассемблерной статической либы
Посл.ответ Сообщение

Ранг: 7.5 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 21 октября 2016 18:53
· Личное сообщение · #1

Мне была нужна легкая библиотека длинной арифметики, и я взял BigLib отсюда. Эта либа написана на асме, поэтому я взялся писать к ней сишний хедер. Пример прототипов функций из этой библиотеки:

Code:
  1. _BigCreate               proto :dword               ; dtValue
  2. _BigDestroy             proto         :dword                    ; pBig
  3. _BigCopy          proto   :dword,:dword                  ; pBig1,pBig2
  4. _BigCompare             proto         :dword,:dword         ; pBig1,pBig2


Я написал такой хедер:

Code:
  1. #ifndef BIGLIB_H
  2. #define BIGLIB_H
  3.  
  4. typedef unsigned long DWORD;
  5.  
  6. extern DWORD BigCreate(DWORD initValue);
  7.  
  8. #endif


и решил проверить его пригодность для проектов в такой программе:

Code:
  1. #include <stdio.h>
  2. #include "biglib.h"
  3.  
  4. #pragma comment(lib, "biglib.lib")
  5.  
  6. int main(int argc, char *argv[])
  7. {
  8.          DWORD big = BigCreate(0);
  9. }


Но почему-то линкер ругается на Unresolved external symbol '__BigCreate'. Здесь видно два знака подчеркивания, и я пробовал поиграться с этими знаками (убирать, добавлять), но ничего не помогает. Как правильно написать хедер и заставить эту стиатическую либу работать в сишных программах? В настройках линкера добавил ее, само собой.




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 21 октября 2016 19:13
· Личное сообщение · #2

Дак ты тело ф-ции создал ? Хотя бы ради приличия



Ранг: 60.6 (постоянный), 87thx
Активность: 0.060
Статус: Участник

Создано: 21 октября 2016 19:41
· Личное сообщение · #3

https://msdn.microsoft.com/en-us/library/deaxefa7.aspx



Ранг: 7.5 (гость), 1thx
Активность: 0.010
Статус: Участник

Создано: 21 октября 2016 19:52
· Личное сообщение · #4

Знаю про манглинг, но у меня в настройках компилятора выбрано соглашение cdecl и еще я добавил к декларации функции __cdecl, то есть в объектном файле имя BigCreate должно превратиться в _BigCreate и будет совпадать с именем функции в либе.



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 21 октября 2016 19:59
· Личное сообщение · #5

Rainbow пишет:

Дак ты тело ф-ции создал ? Хотя бы ради приличия


А зачем? - Тело в lib-файле. Чел хочет прилиноковать его к своей программе.




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 21 октября 2016 20:11
· Личное сообщение · #6

dosprog пишет:
А зачем? - Тело в lib-файле. Чел хочет прилиноковать его к своей программе.


Ну значит имена знать надо

| Сообщение посчитали полезным: igorusha36

Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 21 октября 2016 20:36 · Поправил: dosprog
· Личное сообщение · #7

Rainbow пишет:
Ну значит имена знать надо


Всё известно.

Код должен быть такой:

Code:
  1. #ifndef BIGLIB_H
  2. #define BIGLIB_H
  3.  
  4. typedef unsigned long DWORD;
  5.  
  6.  extern DWORD __stdcall _BigCreate(DWORD initValue);
  7.  
  8. #endif
Code:
  1. #include <stdio.h>
  2. #include "biglib.h"
  3.  
  4. #pragma comment(lib, "biglib.lib")
  5.  
  6. int main(int argc, char *argv[])
  7. {
  8. DWORD big = _BigCreate(0);
  9. }


| Сообщение посчитали полезным: ZeroMemory

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 13 ноября 2016 01:59
· Личное сообщение · #8

а ты в следующий раз, прежде чем такие телеги писать, прикинь, мож через .data всё забадяжить...или через LOCAL...и тебе проще будет и другим поможешь со всяких "сей" соскочить...подумай бро....




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 14 ноября 2016 14:36
· Личное сообщение · #9

igorusha36

О чём вы говорите, если есть либа и её нужно заюзать(хотя это какой то изврат - можно obj вылажить), то придётся дефейнить всё, у меня недавно была такая проблема с intel xed - этот мотор поставляется в виде lib и что бы такое заюзать нужно немного поизвращаться.

-----
vx



 eXeL@B —› Программирование —› Написать хедер для ассемблерной статической либы
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати