gnuTLS || c++ || compilerings error || LÖST

Trädvy Permalänk
Medlem
Registrerad
Sep 2009

gnuTLS || c++ || compilerings error || LÖST

Hej kära sweC.

Som nämnt i rubriken får jag ett kompileringsfel som jag tyvärr inte förstår, erroret:

error: invalid conversion from ‘int’ to ‘gnutls_certificate_type_t’ [-fpermissive] assert(gnutls_certificate_verification_status_print(status, type, &out, 0)>=0); ^

Min kod där felet uppstår:

type = gnutls_certificate_type_get(session); status = gnutls_session_get_verify_cert_status(session); assert(gnutls_certificate_verification_status_print(status, type, &out, 0)>=0); // <-- Här är felet.

Om jag skriver om koden lite:

assert(gnutls_certificate_verification_status_print(gnutls_session_get_verify_cert_status(session), gnutls_certificate_type_get(session), &out, 0)>=0);

Får jag följande error:

/tmp/ccptkVYv.o: In function `main': client.cpp:(.text+0x19a): undefined reference to `gnutls_check_version' client.cpp:(.text+0x1cf): undefined reference to `gnutls_global_init' client.cpp:(.text+0x1f8): undefined reference to `gnutls_certificate_allocate_credentials' client.cpp:(.text+0x236): undefined reference to `gnutls_certificate_set_x509_trust_file' client.cpp:(.text+0x264): undefined reference to `gnutls_init' client.cpp:(.text+0x29c): undefined reference to `gnutls_server_name_set' client.cpp:(.text+0x2c5): undefined reference to `gnutls_set_default_priority' client.cpp:(.text+0x2f7): undefined reference to `gnutls_credentials_set' client.cpp:(.text+0x32a): undefined reference to `gnutls_session_set_verify_cert' client.cpp:(.text+0x346): undefined reference to `gnutls_transport_set_int2' client.cpp:(.text+0x357): undefined reference to `gnutls_handshake_set_timeout' client.cpp:(.text+0x363): undefined reference to `gnutls_handshake' client.cpp:(.text+0x376): undefined reference to `gnutls_error_is_fatal' client.cpp:(.text+0x3af): undefined reference to `gnutls_certificate_type_get' client.cpp:(.text+0x3bd): undefined reference to `gnutls_session_get_verify_cert_status' client.cpp:(.text+0x3d2): undefined reference to `gnutls_certificate_verification_status_print' client.cpp:(.text+0x421): undefined reference to `gnutls_free' client.cpp:(.text+0x434): undefined reference to `gnutls_strerror' client.cpp:(.text+0x474): undefined reference to `gnutls_deinit' client.cpp:(.text+0x480): undefined reference to `gnutls_certificate_free_credentials' client.cpp:(.text+0x485): undefined reference to `gnutls_global_deinit' client.cpp:(.text+0x493): undefined reference to `gnutls_session_get_desc' client.cpp:(.text+0x4cc): undefined reference to `gnutls_free' client.cpp:(.text+0x509): undefined reference to `gnutls_record_send' client.cpp:(.text+0x545): undefined reference to `gnutls_record_recv' client.cpp:(.text+0x580): undefined reference to `gnutls_deinit' client.cpp:(.text+0x58c): undefined reference to `gnutls_certificate_free_credentials' client.cpp:(.text+0x591): undefined reference to `gnutls_global_deinit' client.cpp:(.text+0x5a6): undefined reference to `gnutls_error_is_fatal' client.cpp:(.text+0x5c4): undefined reference to `gnutls_strerror' client.cpp:(.text+0x600): undefined reference to `gnutls_strerror' client.cpp:(.text+0x640): undefined reference to `gnutls_deinit' client.cpp:(.text+0x64c): undefined reference to `gnutls_certificate_free_credentials' client.cpp:(.text+0x651): undefined reference to `gnutls_global_deinit' client.cpp:(.text+0x703): undefined reference to `gnutls_deinit' client.cpp:(.text+0x70f): undefined reference to `gnutls_certificate_free_credentials' client.cpp:(.text+0x714): undefined reference to `gnutls_global_deinit' collect2: error: ld returned 1 exit status Makefile:2: recipe for target 'comp' failed

I dokumentationen står det:

("The certificate type") vilket jag tycker jag har
skrivit och därav förvirringen.

Är det någon som har ett svar på varför det är fel?

Dokumentation om gnutls_certificate_type_get hittas
här.
Lite kort fakta om gnutls (för mitt syfte):

  • Är C baserat (finns c++11 som är begränsat).

  • Jag använder mig av x509.

Tack för svar!

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Trädvy Permalänk
Medlem
Registrerad
Apr 2014

@asdfgh: Du skriver inte hur du har deklarerat variabeln type i nedanstående block.

type = gnutls_certificate_type_get(session); status = gnutls_session_get_verify_cert_status(session); assert(gnutls_certificate_verification_status_print(status, type, &out, 0)>=0); // <-- Här är felet.

Gissningsvis är det här som du har gjort något tokigt eftersom din kompilator verkar anse att type är av typen int.

Ditt andra kompileringsfel ser ut att bero på att länkaren inte hittar de funktioner som listas. Är du säker på att du har valt att länka ditt program med gnutls biblioteket?

-- Citera mig om ni vill få återkoppling --

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

Vilken typ har type i din kod? Felet ser ju ut att vara att type egentligen är en int, och kompilatorn bara är lite dålig på att peka ut exakt vart felet uppstår (notera att den pekar på slutet av anropet, inte 0:an). Tilldelningen till type fungerar eftersom du får konvertera en enum till int implicit, men inte tvärtom eftersom en enum bara kan anta vissa värden.

Ditt andra fel ser bara ut att vara att du inte länkar med gnutls, d.v.s. du har inte med -lgnutls bland dina länkflaggor.

Trädvy Permalänk
Medlem
Registrerad
Sep 2009

Efter att jag skrev om koden lite till:

auto type = gnutls_certificate_type_get(session); auto status = gnutls_session_get_verify_cert_status(session); assert(gnutls_certificate_verification_status_print(status, type, &out, 0)>=0);

samt att jag hade glömt länk flagan så funkade det tack för tips och svar!

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6