
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.172.111.47] |
![]() |
|
![]() |
|
|
доброго времени суток. срочно нужно прикрутить gmp к Builder-у, помогите пожалуйста.
взял с сайта: http://cs.nyu.edu/exact/core/gmp/ dynamic GMP library and header file for MinGW: gmp-dynamic-mingw-4.1.tar.gz в архиве присутствуют: libgmp-3.dll, gmp.h, .info файлы коммандой implib.exe -a -f libgmp-3.lib libgmp-3.dll создал libgmp-3.lib кинул libgmp-3.lib, libgmp-3.dll, gmp.h в папку проекта добавил libgmp-3.lib в проект через Project->Add to project в коде добавил : ![]() ![]() #include "gmp.h" #pragma link "libgmp-3.lib" на попытку скомпилировать проект выдаёт: ![]() ![]() [BCC32 Error] gmp.h(493): E2147 'FILE' cannot start a parameter declaration [BCC32 Error] gmp.h(522): E2147 'FILE' cannot start a parameter declaration [BCC32 Error] gmp.h(545): E2147 'FILE' cannot start a parameter declaration [BCC32 Error] gmp.h(556): E2147 'FILE' cannot start a parameter declaration [BCC32 Error] gmp.h(812): E2303 Type name expected [BCC32 Error] gmp.h(817): E2303 Type name expected [BCC32 Error] gmp.h(885): E2147 'FILE' cannot start a parameter declaration [BCC32 Error] gmp.h(890): E2147 'FILE' cannot start a parameter declaration [BCC32 Error] gmp.h(1095): E2303 Type name expected [BCC32 Error] gmp.h(1114): E2147 'FILE' cannot start a parameter declaration [BCC32 Error] gmp.h(1259): E2303 Type name expected [BCC32 Error] gmp.h(1279): E2147 'FILE' cannot start a parameter declaration [BCC32 Warning] gmp.h(1565): W8041 Negating unsigned value [BCC32 Error] main.cpp(26): E2268 Call to undefined function 'gmp_randinit_mt' подскажите пожалуйста, что я сделал неправильно или как подключать по пунктам. |
Сообщ.
#2
,
|
|
|
Ну, не правильно тут только то, что заголовочные файлы для MinGW, а не для билдера.
Попробуй ![]() ![]() #include <stdio.h> #include "gmp.h" Ещё неплохобы натравить на длл-ку impdef и посмотреть на декорацию имён в получившемся деф-файле |
![]() |
|
|
Цитата Adil @ Ну, не правильно тут только то, что заголовочные файлы для MinGW, а не для билдера. Попробуй ![]() ![]() #include <stdio.h> #include "gmp.h" Ещё неплохобы натравить на длл-ку impdef и посмотреть на декорацию имён в получившемся деф-файле после того как добавил #include <stdio.h>: ![]() ![]() [ILINK32 Error] Fatal: Unable to open file ' „† ��†B.OBJ' не смог прикрепить сюда def файл, приведу его частично: ![]() ![]() LIBRARY LIBGMP-3.DLL EXPORTS __gmp_0 @192 ; __gmp_0 __gmp_allocate_func @2 ; __gmp_allocate_func __gmp_asprintf @3 ; __gmp_asprintf __gmp_asprintf_final @4 ; __gmp_asprintf_final __gmp_asprintf_funs @5 ; __gmp_asprintf_funs __gmp_asprintf_memory @6 ; __gmp_asprintf_memory __gmp_asprintf_reps @7 ; __gmp_asprintf_reps __gmp_assert_fail @8 ; __gmp_assert_fail __gmp_assert_header @9 ; __gmp_assert_header __gmp_bits_per_limb @10 ; __gmp_bits_per_limb __gmp_default_allocate @11 ; __gmp_default_allocate __gmp_default_fp_limb_precision @12 ; __gmp_default_fp_limb_precision __gmp_default_free @13 ; __gmp_default_free __gmp_default_reallocate @14 ; __gmp_default_reallocate __gmp_divide_by_zero @15 ; __gmp_divide_by_zero __gmp_doprnt @16 ; __gmp_doprnt __gmp_doprnt_integer @17 ; __gmp_doprnt_integer __gmp_doprnt_mpf @18 ; __gmp_doprnt_mpf __gmp_doscan @19 ; __gmp_doscan __gmp_errno @20 ; __gmp_errno __gmp_exception @21 ; __gmp_exception __gmp_extract_double @22 ; __gmp_extract_double __gmp_fib_table @23 ; __gmp_fib_table __gmp_fprintf @24 ; __gmp_fprintf __gmp_fprintf_funs @25 ; __gmp_fprintf_funs __gmp_free_func @26 ; __gmp_free_func __gmp_fscanf @27 ; __gmp_fscanf __gmp_fscanf_funs @28 ; __gmp_fscanf_funs __gmp_junk @29 ; __gmp_junk __gmp_modlimb_invert_table @30 ; __gmp_modlimb_invert_table ....... __gmpz_tdiv_ui @375 ; __gmpz_tdiv_ui __gmpz_tstbit @376 ; __gmpz_tstbit __gmpz_ui_kronecker @377 ; __gmpz_ui_kronecker __gmpz_ui_pow_ui @378 ; __gmpz_ui_pow_ui __gmpz_ui_sub @379 ; __gmpz_ui_sub __gmpz_urandomb @380 ; __gmpz_urandomb __gmpz_urandomm @381 ; __gmpz_urandomm __gmpz_xor @382 ; __gmpz_xor |
Сообщ.
#4
,
|
|
|
Цитата amiserio @ Тебе имя файла несколько странноватым не кажется? Русское что ль? [ILINK32 Error] Fatal: Unable to open file ' „† ��†B.OBJ' И эта ошибка остаётся, даже если закомментировть подключение gmp и прагму link? Цитата amiserio @ Вроде всё в порядке.не смог прикрепить сюда def файл, приведу его частично: Если будут проблемы, можно попробовать ![]() ![]() extern "C" #include "gmp.h" } |
![]() |
|
|
Цитата Adil @ Цитата amiserio @ Тебе имя файла несколько странноватым не кажется? Русское что ль? [ILINK32 Error] Fatal: Unable to open file ' „† ��†B.OBJ' И эта ошибка остаётся, даже если закомментировть подключение gmp и прагму link? Цитата amiserio @ Вроде всё в порядке.не смог прикрепить сюда def файл, приведу его частично: Если будут проблемы, можно попробовать ![]() ![]() extern "C" #include "gmp.h" } проблема была в русском названии папки, где располагался проект, сейчас скопировал в корень c:\ и попробовал скомпилировать, получил вот что: ![]() ![]() [ILINK32 Error] Error: Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\6.0\LIB\CP32MT.LIB|crtlvcl [ILINK32 Error] Error: Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\6.0\LIB\CP32MT.LIB|crtlvcl [ILINK32 Error] Error: Unresolved external '___gmpz_init' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_set_str' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_get_str' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmp_randinit_mt' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external 'operator >>(std::basic_istream<char, std::char_traits<char> >&, __mpz_struct *)' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_divexact_ui' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_set' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_cdiv_q_ui' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_fdiv_r_ui' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_sub_ui' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_urandomm' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_mod' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_powm' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_cmp_ui' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_powm_ui' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external 'operator <<(std::basic_ostream<char, std::char_traits<char> >&, const __mpz_struct *)' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_set_ui' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_add_ui' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_cmp' referenced from C:\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_clear' referenced from C:\TEST\RELEASE\MAIN.OBJ при добавлении extern "C": ![]() ![]() [BCC32 Warning] gmp.h(1565): W8041 Negating unsigned value [BCC32 Error] gmp.h(2058): E2132 Templates and overloaded operators cannot have C linkage [BCC32 Error] gmp.h(2059): E2132 Templates and overloaded operators cannot have C linkage [BCC32 Error] gmp.h(2059): E2337 Only one of a set of overloaded functions can be "C" [BCC32 Error] gmp.h(2060): E2132 Templates and overloaded operators cannot have C linkage [BCC32 Error] gmp.h(2060): E2337 Only one of a set of overloaded functions can be "C" [BCC32 Error] gmp.h(2061): E2132 Templates and overloaded operators cannot have C linkage [BCC32 Error] gmp.h(2062): E2132 Templates and overloaded operators cannot have C linkage [BCC32 Error] gmp.h(2062): E2337 Only one of a set of overloaded functions can be "C" [BCC32 Error] gmp.h(2063): E2132 Templates and overloaded operators cannot have C linkage [BCC32 Error] gmp.h(2063): E2337 Only one of a set of overloaded functions can be "C" видимо там не с а с++, если пишу extern "C++", то выводит Unresolved external ... которые я привёл выше. помогите пожалуйста, как быть :'( |
Сообщ.
#6
,
|
|
|
extern "C" - это не объявление языка, а просто указание линковщику о том, что имена фукций в стили Си.
Тут походу одним объявлением не отделаешься, потому что в gmp.h еще и stl-хедеры включены. Попробуй подправить в gmp.h для начала объявление одной фукции, той же __gmpz_init. добавив extern "C" прямо в начало самой строки с её прототипом, типа ![]() ![]() extern "C" void gmpz_init(); Цитата amiserio @ Улыбнуло. если пишу extern "C++" Добавлено Постарайся забыть, всё, что было сказано выше. Просто сделай lib-файл с ключами -a -c у implib |
![]() |
|
|
Цитата Adil @ extern "C" - это не объявление языка, а просто указание линковщику о том, что имена фукций в стили Си. Тут походу одним объявлением не отделаешься, потому что в gmp.h еще и stl-хедеры включены. Попробуй подправить в gmp.h для начала объявление одной фукции, той же __gmpz_init. добавив extern "C" прямо в начало самой строки с её прототипом, типа ![]() ![]() extern "C" void gmpz_init(); Цитата amiserio @ Улыбнуло. если пишу extern "C++" Добавлено Постарайся забыть, всё, что было сказано выше. Просто сделай lib-файл с ключами -a -c у implib сделал lib как Вы сказали для dll скомпиленном в mingw и в VC, пробовал оба варианта, всё тоже самое ![]() ![]() ![]() [ILINK32 Error] Error: Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\6.0\LIB\CP32MT.LIB|crtlvcl [ILINK32 Error] Error: Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\6.0\LIB\CP32MT.LIB|crtlvcl [ILINK32 Error] Error: Unresolved external '___gmpz_init' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_set_str' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_get_str' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmp_randinit_mt' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external 'operator >>(std::basic_istream<char, std::char_traits<char> >&, __mpz_struct *)' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_divexact_ui' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_set' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_cdiv_q_ui' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_fdiv_r_ui' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_sub_ui' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_urandomm' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_mod' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_powm' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_cmp_ui' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_powm_ui' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external 'operator <<(std::basic_ostream<char, std::char_traits<char> >&, const __mpz_struct *)' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_set_ui' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_add_ui' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_cmp' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ [ILINK32 Error] Error: Unresolved external '___gmpz_clear' referenced from C:\DOWNLOADS\GMP DLL\TEST\RELEASE\MAIN.OBJ про экстерны знал впринципе) раз улыбнул то хорошо) пробовал добавлять перед обьявлением функции gmpz_init extern "C" - тоже не помогает ;; |
Сообщ.
#8
,
|
|
|
Только сейчас обратил внимание:
Цитата amiserio @ Это к gmp никакого отношения не имеет - тут что-то с настройками проекта не так. [ILINK32 Error] Error: Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\6.0\LIB\CP32MT.LIB|crtlvcl [ILINK32 Error] Error: Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\6.0\LIB\CP32MT.LIB|crtlvcl И почему-то у тебя линкер в ошибках пишет все имена функций с тремя '_', а должен только с двумя, т.к. в gmp.h уже есть extern "C": Цитата gmp.h Такое ощущение, что у тебя сбиты настройки проекта. Попробуй просто создать новый - обычный VCL-ный - проект, добавить туда gmp.h, link на gmp lib, созданный с ключами -a -c и один только вызов mpz_init: ![]() ![]() #if defined (__cplusplus) extern "C" { #endif ![]() ![]() #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "gmp.h" #pragma link "libgmp-3.lib" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { mpz_ptr p; mpz_init(p); } |
![]() |
|
|
Цитата Adil @ Только сейчас обратил внимание: Цитата amiserio @ Это к gmp никакого отношения не имеет - тут что-то с настройками проекта не так. [ILINK32 Error] Error: Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\6.0\LIB\CP32MT.LIB|crtlvcl [ILINK32 Error] Error: Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES (X86)\CODEGEAR\RAD STUDIO\6.0\LIB\CP32MT.LIB|crtlvcl И почему-то у тебя линкер в ошибках пишет все имена функций с тремя '_', а должен только с двумя, т.к. в gmp.h уже есть extern "C": Цитата gmp.h Такое ощущение, что у тебя сбиты настройки проекта. Попробуй просто создать новый - обычный VCL-ный - проект, добавить туда gmp.h, link на gmp lib, созданный с ключами -a -c и один только вызов mpz_init: ![]() ![]() #if defined (__cplusplus) extern "C" { #endif ![]() ![]() #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "gmp.h" #pragma link "libgmp-3.lib" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { mpz_ptr p; mpz_init(p); } у меня 2009-й билдер, возможно сбиты, но я менял только те параметры которые позволяют после сборки exe запускать его на других компьютерах без установленного билдера. создал пустой проект, сделал всё как Вы привели, получаю: [ILINK32 Error] Error: Unresolved external '___gmpz_init' referenced from C:\GMP TEST\DEBUG\TEST.OBJ ![]() попробовал на 6-м, получил туже басню: ![]() ![]() [C++ Warning] gmp.h(1638): W8026 Functions with exception specifications are not expanded inline ... -||- ... [Linker Error] Unresolved external '___gmpz_init' referenced from D:\GMP TESTING\BCB 6 TEST\UNIT1.OBJ скиньте пожалуйста проект вместе с длл, либ и хидером. п.с. может дело в том что я пользую implib в builder-e 2009-м? или это без разницы? |
Сообщ.
#10
,
|
|
|
ok
Прикреплённый файл ![]() |
![]() |
|
|
Цитата Adil @ ok благодарю. подставив свою dll получил что линкуется, но во время запуска программы возникает ошибка вида: Access violation at adress XXXXXXX in module 'libgmp-3.dll'. Write of address 00000000. уже сменил несколько длл, результат один и тот же:( пробовал длл от VS личной сборки - получил "Ошибка при инициализации приложения (0xc0150002) ...". Всё я это проделывал в BCB 2009. Причём использовал Implib от версий билдера 6 и 2009 по очерёдно. в случаях когда использовал implib 2009-го выскакивало [ILINK32 Error] Error: Unresolved external '___gmpz_init' referenced from C:\LP CRYPTO\RELEASE\MAIN.OBJ, после использования implib от 6-го линкер уже не ругался, программа запускалась, но при нажатии кнопки, в обработчик OnClick которой было вставлено 2 строчки: mpz_ptr mg; mpz_init(mg);, вылазиет Access violation at adress. посмотрите пожалуйста проект, хидер и длл брал отсюда, lib файл создал с помощью implib 6-го билдера. проект для bcb 6: Прикреплённый файл ![]() |
Сообщ.
#12
,
|
|
|
Цитата amiserio @ mpz_ptr mg; mpz_init(mg); Ну так естественно. Я этот код только для проверки слинкуется/не слинкуется привёл, т.к. лень было разбираться с типом передаваемого указателя. А так надо инициализировать указателем на структуру: ![]() ![]() __mpz_struct p; mpz_init(&p); |
![]() |
|
|
Цитата Adil @ Цитата amiserio @ mpz_ptr mg; mpz_init(mg); Ну так естественно. Я этот код только для проверки слинкуется/не слинкуется привёл, т.к. лень было разбираться с типом передаваемого указателя. А так надо инициализировать указателем на структуру: ![]() ![]() __mpz_struct p; mpz_init(&p); понял:) благодарствую. всё работает. |