Member
Статус: Не в сети Регистрация: 08.12.2004 Откуда: Москва
Anoss Спасибо большое, похоже дело было действительно в .lib файле. Я нашел его и добавил в проект. Прежние ошибки пропали, правда появилась одна новая:
[Linker Error] 'C:\ZUBOV\SORTTARN_BCB\WINPAPI.LIB' contains invalid OMF record, type 0x21 (possibly COFF)
Скорее она связано непосредственно с библиотекой и ее использованием, а lib-файл подключился правильно.
Еще раз спасибо, пойду разбираться дальше.
_________________ Я не суеверный. Я наблюдательный
Member
Статус: Не в сети Регистрация: 01.04.2005 Откуда: Москва-Лубянка
Думаю, что нет, насколько я понимаю, майкрософтовские LIB не содержат собственно кода, а только указатели на функции в DLL.. борландовские же LIBы - просто коллекция файлов OBJ, готовых для сборки. Мне кажется, должны быть утилиты, которые делают LIB на основе DLL. В конце концов, если есть исходники библиотеки, можно скомпилить. А можно вообще просто загрузить DLL (LoadLibrary) и все нужные функции взять вручную GetProcAddress.
А что это за библиотека-то? Что такое "P"?)
Member
Статус: Не в сети Регистрация: 08.12.2004 Откуда: Москва
Библиотека называется Perfomance API(PAPI), замеряет количество выполненных процессором инструкций, операций время выполнения, промахи мимо кэша и много чего еще. В основном библиотека предназначена для использования в UNIX системах(Linux, AIX,Solaris, etc), а для Windows дистрибутивы выпускаются гораздо реже. Причем корректная работа возможна только на Windows NT, XP и Pentium I, II, III. Мне больше подошел бы вариант создания LIB из DLL, это было бы то что надо. Если у Вас программа есть или название хотя бы сохранилось, буду очень благодарен. Просто скомпилить исходники я так понимаю надо в Visual C, а я в нем не очень силен, а про LoadLibrary и GetProcAddress вообще первый раз слышу.
На всякий случай(если кто заинтересуется), адрес разработчика библиотеки:
http://icl.cs.utk.edu/papi
_________________ Я не суеверный. Я наблюдательный
Member
Статус: Не в сети Регистрация: 01.04.2005 Откуда: Москва-Лубянка
Нет, если вы хотите получить борландовский LIB, то и компилить надо компилятором от борланд)
Я ошибался) В пакете borland c++ builder ЕСТЬ утилита coff2omf, она должна преобразовать ваш COFF-LIB в то, что нужно борланду. Попробуйте.. если она не справится, я вам расскажу про GetProcAddress
Member
Статус: Не в сети Регистрация: 08.12.2004 Откуда: Москва
По названию так должна справиться. Только ее надо использовать с какими-то ключами наверно? Попробовал перекиннуть ее в папку с библиотекой и запустить. Ничего не изменилось.
_________________ Я не суеверный. Я наблюдательный
Member
Статус: Не в сети Регистрация: 08.12.2004 Откуда: Москва
Anoss поиск я че-то забыл напрочь;).
с преобразованием в OMF все путем. Но ошибка
Цитата:
[Linker Error] Unresolved external '_PAPI_library_init' referenced from C:\ZUBOV\SORTTARN_BCB\UNIT1.OBJ [Linker Error] Unresolved external '_PAPI_start_counters' referenced from C:\ZUBOV\SORTTARN_BCB\UNIT1.OBJ
вернулась. В чем может быть проблема, в свЯзи с DLL или конвертировании библиотеки (ключи надо было использовать)?
Простите за обилие мелких вопросов, просто опыта использования таких библиотек раньше не было.
_________________ Я не суеверный. Я наблюдательный
Member
Статус: Не в сети Регистрация: 01.04.2005 Откуда: Москва-Лубянка
Попробуйте с ключом -lib:st (coff2omf -lib:st inputfile outputfile).. при конвертировании там могли появиться проблемы с наличием/отсутствием символа "_" в начале имен функции.. если больше ничего не поможет, попробуйте просто убрать лидирующий "_" из имен функций в вашей программе и в .h файле)
Member
Статус: Не в сети Регистрация: 08.12.2004 Откуда: Москва
попробовал вызывать coff2omf со всеми вариантами ключей ( ms, st, ca). Результат нет, то есть ошибка не исчезла.
С именами функций ситуация такая. У меня в программе и в H-файле функции описаны без лидирующего символа "_".
В самом начале papi.h стоит
Цитата:
#ifndef _PAPI #define _PAPI
но мне кажется это влиять на сами функции не должно. Может быть в том, что в DLL, где лежит реализация,
они как раз подменяются вызовами _PAPI_start_counters и т.д.(не уверен в этом)?
Member
Статус: Не в сети Регистрация: 01.04.2005 Откуда: Москва-Лубянка
Цитата:
#ifndef _PAPI #define _PAPI
это стандартный способ избежать многократного включения файла.
DLL тут вообще не при чем.
Попробуйте в project options на закладке Advanced compiler поменять "C calling convention" на "standard call".
Member
Статус: Не в сети Регистрация: 08.12.2004 Откуда: Москва
К сожалению, пока эксперименты не увенчались успехом...
Сейчас пробую другой вариант: получение .lib файла из .dll.
Для этого пользуюсь утилитой implib из \CBuilder6\Bin.
implib -a -c papi_imp.lib WinPAPI.dll
Получаю файл papi_imp.lib.
После вставки этого файла в проект ошибка не исчезает, а принимает следующий вид:
[Linker Error] Unresolved external 'PAPI_library_init' referenced from C:\ZUBOV\SORTTARN_BCB\UNIT1.OBJ
[Linker Error] Unresolved external 'PAPI_start_counters' referenced from C:\ZUBOV\SORTTARN_BCB\UNIT1.OBJ
То есть лидирующее подчеркивание в .lib файлах появилось. А unresolved external почему-то не пропал.
В чем может быть дело:
- неверный вызов implib
- ненахождение самого DLL(это возможно?)
- что-то еще?
Member
Статус: Не в сети Регистрация: 01.04.2005 Откуда: Москва-Лубянка
Так у вас теперь наоборот, в obj файле все функции без подчеркиваний, а в lib - с подчеркиваниями.. вы поменяли "C calling convention" на "standard call"?..
вообще, проще всего перейти на компилятор майкрософт.. этого хочет майкрософт, и очень успешно этого добивается)
Подскажите, пожалуйста! Как сделать таблицу с раскрывающимся списком подстрок, в которой, если щелкнуть по плюсику, раскроется список подстрок (с колонками).
Например:
Member
Статус: Не в сети Регистрация: 08.07.2004 Откуда: Краснодар
Вобщем так-есть массив
Char mass[160];Заполнен цифрами
Вопрос-как мне вывести всё это дело в TMemo чтоб в строчке было по 16 элементов,и в шеснадцатиричном представлении.
Помогите PLZ
_________________ Друзей не надо иметь, с ними надо дружить!
Junior
Статус: Не в сети Регистрация: 15.09.2004 Откуда: Москва
Var
i:integer; tmps:string;
----------------------------------
----------------------------------
tmps:='';
for i:=0 to CharCount-1 do
begin
tmps:=tmps+IntToHexStr(mass[i])+' ';
if (i mod 16) = 0 then
begin
Memo.Lines.Add(tmps);
tmps:='';
end;
end;
P/S/ Извините, что на Паскале... Просто я - дельфиец. Но в общем выглядеть должно приблизительно так. Функция IntToHexStr может называться и по-другому, точно я не помню. Но это уже в хелп, поиск по строковым функциям.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения