Как использовать API C gnutls в проекте C ++ - PullRequest
1 голос
/ 12 декабря 2011

Я пытаюсь интегрировать пример Gnutls из GnuTLS Doc в класс C ++.К сожалению, он выбрасывает неопределенные ссылки при соединении с g ++.Поэтому я попытался скомпилировать Пример (в чистом C) без изменений с помощью g ++, но безуспешно.Это работает, если я использую gcc.

tino@develeee:~/Code/tlstests$ gcc tlsclient.c -lgnutls
/tmp/ccBqJdQr.o: In function `main':
tlsclient.c:(.text+0x3d0): undefined reference to `tcp_connect'
tlsclient.c:(.text+0x58d): undefined reference to `tcp_close'
collect2: ld returned 1 exit status
tino@develeee:~/Code/tlstests$ g++ tlsclient.c -lgnutls
/tmp/ccRq5DcT.o: In function `load_keys()':
tlsclient.c:(.text+0x186): undefined reference to gnutls_pcert_import_x509_raw(gnutls_pcert_st*, gnutls_datum_t const*, gnutls_x509_crt_fmt_t, unsigned int)'
tlsclient.c:(.text+0x299): undefined reference to gnutls_privkey_init(gnutls_privkey_st**)'
tlsclient.c:(.text+0x2b5): undefined reference to `gnutls_privkey_import_x509(gnutls_privkey_st*, gnutls_x509_privkey_int*, unsigned int)'
/tmp/ccRq5DcT.o: In function `main':
tlsclient.c:(.text+0x37e): undefined reference to `gnutls_certificate_set_retrieve_function2(gnutls_certificate_credentials_st*, int (*)(gnutls_session_int*, gnutls_datum_t const*, int, gnutls_pk_algorithm_t const*, int, gnutls_pcert_st**, unsigned int*, gnutls_privkey_st**))'
tlsclient.c:(.text+0x3d6): undefined reference to `tcp_connect()'
tlsclient.c:(.text+0x594): undefined reference to `tcp_close(int)'
collect2: ld returned 1 exit status

Вы можете видеть, что только функции, объявленные в gnutls / abstract.h, не определены с помощью компилятора C ++.(Игнорировать неопределенные ссылки на tcp_connect () и tcp_close (), они просто не определены и объявлены extern)

Я думаю, что C ++ - это C плюс классы и шаблоны?Поэтому я не могу себе представить, почему я получил эти ошибки.

У кого-нибудь было что-то подобное раньше?

Ответы [ 2 ]

6 голосов
/ 12 декабря 2011

Оберните ваши заголовки в блоке extern "C" {}. Похоже, gnutls/abstract.h включен как заголовок C ++.

1 голос
/ 05 июня 2013

Кроме того, похоже, что авторы также предоставили интерфейс c ++.

http://gnutls.org/manual/html_node/Simple-client-example-in-C_002b_002b.html

#include <gnutls/gnutlsxx.h>
...