2012-12-08 21 views
6

Tôi đang viết chương trình nhắn tin tức thì an toàn trong C++ bằng cách sử dụng thư viện libtomcrypt C cho các hàm RSA và SPRNG của nó. Tôi đã libtomcrypt biên dịch như là một thư viện tĩnh và tôi đã có thể liên kết với nó và chạy các chức năng sprng và xem và sử dụng dữ liệu ngẫu nhiên nó được tạo ra.Không thể liên kết tomsfastmath với libtomcrypt

Sự cố tôi đang gặp đang cố gắng sử dụng hàm rsa_make_key() có chức năng phụ thuộc vào thư viện toán được liên kết để hoạt động.

Trong trường hợp này, tôi đang cố gắng sử dụng Tomsfastmath (tfm) mà tôi cũng đang cố liên kết dưới dạng thư viện tĩnh. Cả hai thư viện này nằm trong thư mục dự án của riêng họ, một thư mục từ thư mục dự án của tôi (ví dụ: ../libtomcrypt)

Trong mã của tôi khi tôi cố truy cập bộ mô tả toán học "tfm_desc", tôi gặp lỗi test_crypt.cpp:8:11: error: 'tfm_desc' was not declared in this scope. Điều này khiến tôi nghĩ rằng tfm không được liên kết chính xác với libtomcrypt. Tôi đã đọc tài liệu cho cả hai thứ này, nó không rõ ràng lắm.

Tôi đang ở kết thúc ở đây. Tôi đang làm gì sai?

Dưới đây là làm cho tôi tập tin

CC:=gcC#C Compiler 
CFLAGS:=-std=c99 -O0 -I/home/k3rb3ros/csci484-CMU-/libtomcrypt-1.17/src/headers -g -  Wall -Wextra#C Compiler flags 
CPP:=g++ #C++ Compiler 
CPPFLAGS:=-std=gnu++0x -O0 -I/home/k3rb3ros/csci484/csci484-CMU-/libtomcrypt- 1.17/src/headers -L. -g -Wall -Wextra#C++ Compiler flags 
#CPPFLAGS:=-std=gnu++0x -O0 -g -Wall -Wextra #C++ Compiler flags 
LDFLAGS:= -lSDL -lSDL_net -ltfm -ltomcrypt 
CSOURCES= #C files used in this program 
CPPSOURCES=connection.cpp chat.cpp test_crypt.cpp #CPP files used in this prgram 
#COBJECTS=$(CSOURCES:.c=.o)libtfm.a libtomcrypt.a 
COBJECTS=$(CSOURCES:.c=.o) 
CPPOBJECTS=$(CPPSOURCES:.cpp=.o) 
BINARY=down_low 

all: $(BINARY) $(COBJECTS) $(CPPOBJECTS) 
.c.o: 
     $(CC) $(CFLAGS) -c $< -o [email protected] 

.cpp.o: 
     $(CPP) $(CPPFLAGS) -c $< -o [email protected] 

    $(BINARY): $(COBJETS) $(CPPOBJECTS) 
     $(CPP) $(CPPFLAGS) $(COBJECTS) $(CPPOBJECTS) -o [email protected] $(LDFLAGS) 

    clean: 
    rm -rv $(BINARY) $(COBJECTS) $(CPPOBJECTS) 

và đây là chức năng test_crypt tôi

#include "headers/test_crypt.h" 
using namespace std; 

void test_crypt() 
{ 
    int err = 0; 
    int rng_idx = -1; //rng index, not sure if I need this 
    ltc_mp = tfm_desc; //tell tomcrypt to use toms fast math 
    rsa_key pub_key; 
    prng_state random_gen; 

    if((err = sprng_start(&random_gen)) != CRYPT_OK) //start the rng and check for errors 
    { 
     cout << "start error " << error_to_string(err) << endl; 
    } 

    rng_idx = find_prng("sprng"); 
    if((err = sprng_ready(&random_gen)) != CRYPT_OK) 
    { 
     cout << "Ready error " << error_to_string(err) << endl; 
    } 

    //test toms fast math present and working 
    //fp_int test; 
    //fp_init(&test); 

    //sprng_read(entropy, size, &random_gen); 

    /* 
    if((err = rsa_make_key(NULL,   //PRNG state 
          rng_idx,  //PRNG idx 
          1024/8,   //Size of key 
          65537,   //e 
          &pub_key)  //RSA key 
          ) != CRYPT_OK) //if conditon test 
    { 
     cout << "RSA Key Generation error " << error_to_string(err) << endl; 
    } 
    rsa_free(&pub_key); //free the key when we are done with it; 
    */ 
    sprng_done(&random_gen); //done generating random numbers 
} 
+1

Đó là lỗi trình biên dịch chứ không phải lỗi liên kết. – melpomene

Trả lời

0

Thêm -DTFM_DESC đến của makefile của bạn CFLAGSCPPFLAGS biến nên các tiêu đề sẽ tuyên bố tfm_desc như là một biến extern.

Biến số tfm_desc sau đó sẽ bị kéo vào từ thư viện.

+0

Là một lưu ý phụ, bạn có thể muốn đổi tên 'CPPFLAGS' thành' CXXFLAGS'. 'CPPFLAGS' thường được sử dụng để cấu hình các tùy chọn cho Bộ tiền xử lý C; 'CXXFLAGS' thường được sử dụng cho C++. –

+0

Tôi đã có thể lấy mã của mình để biên dịch bằng cách thêm -DTFM_DESC vào CPP (nên là cờ CXX) và sửa lỗi -L trỏ đến thư mục sai. Cảm ơn bạn đã giúp đỡ. Thông thường Makefiles là tuyệt vời nhưng dự án này đã được ra khỏi bàn tay. – K3rb3ros

0

Bạn cần phải bao gồm tiêu đề có liên quan trong hồ sơ test_crypt của bạn.

Tôi đã tuyên bố không chính xác rằng bạn cần phải bao gồm tfm.h trước đó. Thay vào đó, bạn nên #include "tomcrypt.h" vì nó sẽ cung cấp cho bạn hằng số bạn cần.

Để làm rõ những gì melpomene nói, vấn đề của bạn là bạn không bao gồm các tiêu đề chính xác mà gây ra trình biên dịch để - chính xác - cho bạn biết rằng định danh bạn đang sử dụng không được khai báo.

+0

được bao gồm trong tập tin myheader Tôi muốn giải pháp này dễ dàng, nhưng một cái gì đó khác đang xảy ra ở đây. – K3rb3ros

Các vấn đề liên quan