![]() |
|
Модераторы: feodorv |
![]()
|
|
| bomberman |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 4.4.2008 Где: Брест Репутация: нет Всего: нет |
Приветствую, господа!
Вопрос таков: в результате сборки (под Visual C++ 6.0) , используя OpenSSL openssl-0.9.8g (пробовал и другие версии) кода: // ssl2.cpp #include "openssl\crypto.h" #include <openssl\pem.h> #include <openssl\rsa.h> #define PRIVAT "./privat.key" #define PUBLIC "./public.key" void main() { RSA * rsa = NULL; unsigned long bits = 2048; /* äëèíà êëþ÷à â áèòàõ */ FILE *priv_key_file = NULL, *pub_key_file = NULL; const EVP_CIPHER *cipher = NULL; priv_key_file = fopen(PRIVAT, "wb"); pub_key_file = fopen(PUBLIC, "wb"); rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL); OpenSSL_add_all_ciphers(); cipher = EVP_get_cipherbyname("bf-ofb"); PEM_write_RSAPrivateKey(priv_key_file, rsa, cipher, NULL, 0, NULL, "hello"); PEM_write_RSAPublicKey(pub_key_file, rsa); RSA_free(rsa); } получаю подачу от компилятора: --------------------Configuration: ssl2 - Win32 Debug-------------------- Compiling... ssl2.cpp Linking... ssl2.obj : error LNK2001: unresolved external symbol _RSA_free ssl2.obj : error LNK2001: unresolved external symbol _PEM_write_RSAPublicKey ssl2.obj : error LNK2001: unresolved external symbol _PEM_write_RSAPrivateKey ssl2.obj : error LNK2001: unresolved external symbol _EVP_get_cipherbyname ssl2.obj : error LNK2001: unresolved external symbol _OpenSSL_add_all_ciphers ssl2.obj : error LNK2001: unresolved external symbol _RSA_generate_key Debug/ssl2.exe : fatal error LNK1120: 6 unresolved externals Error executing link.exe. ssl2.exe - 7 error(s), 0 warning(s) Я указал ему исходники, где определены функции, имена которых он указывает. Например, для строки ошибки "ssl2.obj : error LNK2001: unresolved external symbol _RSA_free" я указал #include <openssl/rsa_lib.с> (предварительно закидывая нашедшие исходники в созданную папку openssl). И в результате указания исходников для всех строк с ошибками я получал дополнительные ошибки, которых накопилось до 90. Избавился от полного появления об ошибках типа "error LNK2001: unresolved external symbol" только указанием следующих подключений: #include <openssl/rsa_lib.c> #include <openssl/bn_add.c> #include <openssl/rsa_eay.c> #include <openssl/bn_exp.c> #include <openssl/eng_init.c> #include <openssl/ex_data.c> #include <openssl/engine.h> #include <openssl/tb_rsa.c> #include <openssl/mem.c> #include <openssl/err.c> #include <openssl/bn_blind.c> #include <openssl/bn_lib.c> #include <openssl/cryptlib.c> #include <openssl/bn_ctx.c> #include <openssl/bn_rand.c> #include <openssl/rand_lib.c> #include <openssl/bn_gcd.c> #include <openssl/bn_mul.c> #include <openssl/bn_asm.c> #include <openssl/mem_clr.c> #include <openssl/bn_mont.c> #include <openssl/rsa_none.c> #include <openssl/rsa_ssl.c> #include <openssl/rsa_oaep.c> #include <openssl/rsa_pk1.c> #include <openssl/rsa_x931.c> #include <openssl/bn_div.c> #include <openssl/bn_sqr.c> #include <openssl/bn_recp.c> #include <openssl/bn_mod.c> #include <openssl/bn_word.c> #include <openssl/eng_lib.c> #include <openssl/lhash.c> #include <openssl/stack.c> #include <openssl/eng_table.c> #include <openssl/eng_list.c> #include <openssl/mem_dbg.c> #include <openssl/b_print.c> #include <openssl/buffer.c> #include <openssl/md_rand.c> #include <openssl/tb_rand.c> #include <openssl/bn_shift.c> #include <openssl/digest.c> #include <openssl/m_sha1.c> #include <openssl/rsautl.c> Однако потом получил ошибки следующего рода: --------------------Configuration: ssl2 - Win32 Debug-------------------- Compiling... ssl2.cpp d:\source\st\utils\ssl1\openssl\apps.h(257) : error C2059: syntax error : '(' d:\source\st\utils\ssl1\openssl\apps.h(257) : error C2143: syntax error : missing ',' before '*' d:\source\st\utils\ssl1\openssl\apps.h(257) : error C2501: 'nm' : missing storage-class or type specifiers d:\source\st\utils\ssl1\openssl\apps.h(257) : warning C4518: 'unsigned long ' : storage-class or type specifier(s) unexpected here; ignored d:\source\st\utils\ssl1\openssl\apps.h(257) : error C2501: 'lflags' : missing storage-class or type specifiers d:\source\st\utils\ssl1\openssl\apps.h(257) : warning C4228: nonstandard extension used : qualifiers after comma in declarator list are ignored d:\source\st\utils\ssl1\openssl\apps.h(257) : error C2143: syntax error : missing ';' before ')' d:\source\st\utils\ssl1\openssl\apps.h(257) : error C2143: syntax error : missing ';' before ')' d:\source\st\utils\ssl1\openssl\apps.h(319) : error C2226: syntax error : unexpected type 'LPCSTR' d:\source\st\utils\ssl1\openssl\rsautl.c(248) : error C2440: '=' : cannot convert from 'void *' to 'unsigned char *' Conversion from 'void*' to pointer to non-'void' requires an explicit cast d:\source\st\utils\ssl1\openssl\rsautl.c(249) : error C2440: '=' : cannot convert from 'void *' to 'unsigned char *' Conversion from 'void*' to pointer to non-'void' requires an explicit cast D:\source\st\UTILS\ssl2\ssl2.cpp(65) : error C2731: 'main' : function cannot be overloaded D:\source\st\UTILS\ssl2\ssl2.cpp(63) : see declaration of 'main' Error executing cl.exe. ssl2.exe - 10 error(s), 2 warning(s) !!! Строка 257 – это прототип функции void print_name(BIO *out, const char *title, X509_NAME *nm, unsigned long lflags); Также меня беспокоил тот факт, что исходники, писаны на С, а не С++ (иногда думал, что вот именно с этого следует начинать, но ведь народ-то в основном работает с OpenSSL на с++-компиляторах!). Я менял настройки компилятора в Visual, менял includ'ы, не помогает. Вот сам apps.h: #ifndef HEADER_APPS_H #define HEADER_APPS_H #include "e_os.h" #include <openssl/bio.h> #include <openssl/x509.h> #include <openssl/lhash.h> #include <openssl/conf.h> #include <openssl/txt_db.h> #ifndef OPENSSL_NO_ENGINE #include <openssl/engine.h> #endif #include <openssl/ossl_typ.h> int app_RAND_load_file(const char *file, BIO *bio_e, int dont_warn); int app_RAND_write_file(const char *file, BIO *bio_e); /* When `file' is NULL, use defaults. * `bio_e' is for error messages. */ void app_RAND_allow_write_file(void); long app_RAND_load_files(char *file); /* `file' is a list of files to read, * separated by LIST_SEPARATOR_CHAR * (see e_os.h). The string is * destroyed! */ #ifdef OPENSSL_SYS_WIN32 #define rename(from,to) WIN32_rename((from),(to)) int WIN32_rename(const char *oldname,const char *newname); #endif #ifndef MONOLITH #define MAIN(a,v) main(a,v) #ifndef NON_MAIN CONF *config=NULL; BIO *bio_err=NULL; #else extern CONF *config; extern BIO *bio_err; #endif #else #define MAIN(a,v) PROG(a,v) extern CONF *config; extern char *default_config_file; extern BIO *bio_err; #endif #ifndef OPENSSL_SYS_NETWARE #include <signal.h> #endif #ifdef SIGPIPE #define do_pipe_sig() signal(SIGPIPE,SIG_IGN) #else #define do_pipe_sig() #endif #if defined(MONOLITH) && !defined(OPENSSL_C) # define apps_startup() \ do_pipe_sig() # define apps_shutdown() #else # ifndef OPENSSL_NO_ENGINE # if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WIN16) || \ defined(OPENSSL_SYS_WIN32) # ifdef _O_BINARY # define apps_startup() \ do { _fmode=_O_BINARY; do_pipe_sig(); CRYPTO_malloc_init(); \ ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \ ENGINE_load_builtin_engines(); setup_ui_method(); } while(0) # else # define apps_startup() \ do { _fmode=O_BINARY; do_pipe_sig(); CRYPTO_malloc_init(); \ ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \ ENGINE_load_builtin_engines(); setup_ui_method(); } while(0) # endif # else # define apps_startup() \ do { do_pipe_sig(); OpenSSL_add_all_algorithms(); \ ERR_load_crypto_strings(); ENGINE_load_builtin_engines(); \ setup_ui_method(); } while(0) # endif # define apps_shutdown() \ do { CONF_modules_unload(1); destroy_ui_method(); \ EVP_cleanup(); ENGINE_cleanup(); \ CRYPTO_cleanup_all_ex_data(); ERR_remove_state(0); \ ERR_free_strings(); } while(0) # else # if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WIN16) || \ defined(OPENSSL_SYS_WIN32) # ifdef _O_BINARY # define apps_startup() \ do { _fmode=_O_BINARY; do_pipe_sig(); CRYPTO_malloc_init(); \ ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \ setup_ui_method(); } while(0) # else # define apps_startup() \ do { _fmode=O_BINARY; do_pipe_sig(); CRYPTO_malloc_init(); \ ERR_load_crypto_strings(); OpenSSL_add_all_algorithms(); \ setup_ui_method(); } while(0) # endif # else # define apps_startup() \ do { do_pipe_sig(); OpenSSL_add_all_algorithms(); \ ERR_load_crypto_strings(); \ setup_ui_method(); } while(0) # endif # define apps_shutdown() \ do { CONF_modules_unload(1); destroy_ui_method(); \ EVP_cleanup(); \ CRYPTO_cleanup_all_ex_data(); ERR_remove_state(0); \ ERR_free_strings(); } while(0) # endif #endif typedef struct args_st { char **data; int count; } ARGS; #define PW_MIN_LENGTH 4 typedef struct pw_cb_data { const void *password; const char *prompt_info; } PW_CB_DATA; int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_data); int setup_ui_method(void); void destroy_ui_method(void); int should_retry(int i); int args_from_file(char *file, int *argc, char **argv[]); int str2fmt(char *s); void program_name(char *in,char *out,int size); int chopup_args(ARGS *arg,char *buf, int *argc, char **argv[]); #ifdef HEADER_X509_H int dump_cert_text(BIO *out, X509 *x); void print_name(BIO *out, const char *title, X509_NAME *nm, unsigned long lflags); #endif int set_cert_ex(unsigned long *flags, const char *arg); int set_name_ex(unsigned long *flags, const char *arg); int set_ext_copy(int *copy_type, const char *arg); int copy_extensions(X509 *x, X509_REQ *req, int copy_type); int app_passwd(BIO *err, char *arg1, char *arg2, char **pass1, char **pass2); int add_oid_section(BIO *err, CONF *conf); X509 *load_cert(BIO *err, const char *file, int format, const char *pass, ENGINE *e, const char *cert_descrip); EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin, const char *pass, ENGINE *e, const char *key_descrip); EVP_PKEY *load_pubkey(BIO *err, const char *file, int format, int maybe_stdin, const char *pass, ENGINE *e, const char *key_descrip); STACK_OF(X509) *load_certs(BIO *err, const char *file, int format, const char *pass, ENGINE *e, const char *cert_descrip); X509_STORE *setup_verify(BIO *bp, char *CAfile, char *CApath); #ifndef OPENSSL_NO_ENGINE ENGINE *setup_engine(BIO *err, const char *engine, int debug); #endif int load_config(BIO *err, CONF *cnf); char *make_config_name(void); /* Functions defined in ca.c and also used in ocsp.c */ int unpack_revinfo(ASN1_TIME **prevtm, int *preason, ASN1_OBJECT **phold, ASN1_GENERALIZEDTIME **pinvtm, const char *str); #define DB_type 0 #define DB_exp_date 1 #define DB_rev_date 2 #define DB_serial 3 /* index - unique */ #define DB_file 4 #define DB_name 5 /* index - unique when active and not disabled */ #define DB_NUMBER 6 #define DB_TYPE_REV 'R' #define DB_TYPE_EXP 'E' #define DB_TYPE_VAL 'V' typedef struct db_attr_st { int unique_subject; } DB_ATTR; typedef struct ca_db_st { DB_ATTR attributes; TXT_DB *db; } CA_DB; BIGNUM *load_serial(char *serialfile, int create, ASN1_INTEGER **retai); int save_serial(char *serialfile, char *suffix, BIGNUM *serial, ASN1_INTEGER **retai); int rotate_serial(char *serialfile, char *new_suffix, char *old_suffix); int rand_serial(BIGNUM *b, ASN1_INTEGER *ai); CA_DB *load_index(char *dbfile, DB_ATTR *dbattr); int index_index(CA_DB *db); int save_index(const char *dbfile, const char *suffix, CA_DB *db); int rotate_index(const char *dbfile, const char *new_suffix, const char *old_suffix); void free_index(CA_DB *db); int index_name_cmp(const char **a, const char **b); int parse_yesno(const char *str, int def); X509_NAME *parse_name(char *str, long chtype, int multirdn); int args_verify(char ***pargs, int *pargc, int *badarg, BIO *err, X509_VERIFY_PARAM **pm); void policies_print(BIO *out, X509_STORE_CTX *ctx); #define FORMAT_UNDEF 0 #define FORMAT_ASN1 1 #define FORMAT_TEXT 2 #define FORMAT_PEM 3 #define FORMAT_NETSCAPE 4 #define FORMAT_PKCS12 5 #define FORMAT_SMIME 6 #define FORMAT_ENGINE 7 #define FORMAT_IISSGC 8 /* XXX this stupid macro helps us to avoid * adding yet another param to load_*key() */ #define EXT_COPY_NONE 0 #define EXT_COPY_ADD 1 #define EXT_COPY_ALL 2 #define NETSCAPE_CERT_HDR "certificate" #define APP_PASS_LEN 1024 #define SERIAL_RAND_BITS 64 #endif Я исправил эти ошибки (указав в самом хидере #include <openssl/apps.c>), так как ошибки вновь сводились к отсутствующим определениям необходимых функций, но в результате получил новые errors (нет смысла указывать все): ......... d:\source\st\utils\ssl1\openssl\apps.h(236) : error C2378: 'ARGS' : redefinition; symbol cannot be overloaded with a typedef d:\source\st\utils\ssl1\openssl\apps.h(243) : error C2378: 'PW_CB_DATA' : redefinition; symbol cannot be overloaded with a typedef d:\source\st\utils\ssl1\openssl\apps.h(246) : error C2061: syntax error : identifier 'PW_CB_DATA' d:\source\st\utils\ssl1\openssl\apps.h(246) : fatal error C1003: error count exceeds 100; stopping compilation Error executing cl.exe. ssl2.exe - 102 error(s), 2 warning(s) Заранее спасибо за ответ! |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: нет Всего: 17 |
и где тут сборка OpenSSL?
то что вы делаете, можно назвать использованием библиотеки OpenSSL. причем очень странным способом... собирите сначала OpenSSL в библиотеку, а потом используйте ее. |
|||
|
||||
| bomberman |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 4.4.2008 Где: Брест Репутация: нет Всего: нет |
Спасибо за ответ! А что бы рекомендовали почитать по поводу сборки?
Это сообщение отредактировал(а) bomberman - 10.4.2008, 15:00 |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: нет Всего: 17 |
справку по исходнику OpenSSL.
если там написано, как это чудо собрать под Visual Studio - вообще замечательно. если не написано, тогда проще найти исходник, в котором это будет описано. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |