2012-07-18 6 views
0

Tor를 약간 수정 한 후 컴파일하는 데 문제가 있습니다.헤더 포함 문제

control.c 파일에는 rend_service_t (rendservice.h에 위치) 구조체를 나타내는 코드가 추가되었습니다. 나는 그것을 이전에 포함하지 않았기 때문에 control.c의 상단에 rendservice.h을 포함 시켰습니다. 나는 메이크 파일이 포함 된 사용하려고하면

,이 오류가 얻을 :

control.c:2841: error: 'rend_service_t' undeclared (first use in this function) 

내가 rendservice.c 포함지고 있지 않거나 처음 컴파일 점점되지 같은데요를, 그래서 거기에 디렉토리를 확인 렌더 서비스를위한 오브젝트 파일이 아닙니다. 나는 분명히 포함되어 있기 때문에 약간 혼란 스럽다. 이 문제의 원인은 무엇입니까?

또한 을 편집하여 rendservice.c/hcontrol.c/h 앞에 오도록했으나 아무런 차이가 없습니다. control.c에서

:

... 
#include "rendservice.h" 
... 
static int 
handle_control_addservice(control_connection_t *conn, uint32_t len, 
          const char *body) 
{ 
    smartlist_t *args; 
    rend_service_t *service; 
... 

rendservice.c에서 :

... 
/** Represents a single hidden service running at this OP. */ 
typedef struct rend_service_t { 
    /* Fields specified in config file */ 
    char *directory; /**< where in the filesystem it stores it */ 
    smartlist_t *ports; /**< List of rend_service_port_config_t */ 
    rend_auth_type_t auth_type; /**< Client authorization type or 0 if no client 
           * authorization is performed. */ 
    smartlist_t *clients; /**< List of rend_authorized_client_t's of 
         * clients that may access our service. Can be NULL 
         * if no client authorization is performed. */ 
    /* Other fields */ 
    crypto_pk_env_t *private_key; /**< Permanent hidden-service key. */ 
    char service_id[REND_SERVICE_ID_LEN_BASE32+1]; /**< Onion address without 
                * '.onion' */ 
    char pk_digest[DIGEST_LEN]; /**< Hash of permanent hidden-service key. */ 
    smartlist_t *intro_nodes; /**< List of rend_intro_point_t's we have, 
          * or are trying to establish. */ 
    time_t intro_period_started; /**< Start of the current period to build 
           * introduction points. */ 
    int n_intro_circuits_launched; /**< Count of intro circuits we have 
            * established in this period. */ 
    rend_service_descriptor_t *desc; /**< Current hidden service descriptor. */ 
    time_t desc_is_dirty; /**< Time at which changes to the hidden service 
         * descriptor content occurred, or 0 if it's 
         * up-to-date. */ 
    time_t next_upload_time; /**< Scheduled next hidden service descriptor 
          * upload time. */ 
    /** Map from digests of Diffie-Hellman values INTRODUCE2 to time_t of when 
    * they were received; used to prevent replays. */ 
    digestmap_t *accepted_intros; 
    /** Time at which we last removed expired values from accepted_intros. */ 
    time_t last_cleaned_accepted_intros; 
} rend_service_t; 
... 
+1

코드를 게시하십시오. –

+0

'rend_service_t '가 어떻게 선언되는지 코드를 보여줄 수 있습니까? 그리고'rend_service_t'를 사용하는 코드는 무엇입니까? – Marlon

답변

1

rend_service_trendservice.c의 개인 구조입니다.이 파일은 .c 파일 외부에서 사용하기위한 것으로 보이지 않으며, rendservice.h에 선언되지 않았습니다. (내가보고있는 rendservice.c의 버전을 보시려면 여기를보십시오 : https://doxygen.torproject.org/rendservice_8c_source.html).

그래서 이것은 헤더 포함 문제가 아닙니다. 구조가 헤더에서 전혀 삭제되지 않았습니다.

struct rend_service_t을 사용하려는 대상에 대해 질문해야합니다.

+0

구조체를 '공개'할 수 있습니까? 아니면'rendservice.c'와'rendservice.h'에 함수를 작성하고'control.c'에서 호출해야합니까? –

+0

@ 케빈 : 저는 코드베이스에 익숙하지 않습니다. 구조를 두 소스 파일에서 사용되는 일부 헤더로 옮길 수는 있지만 더 많은 리팩토링이 필요하다고 생각됩니다. 구조체를 다루는 많은 함수가'rendservice.c'에서'static'으로 표시되어있는 것처럼 보입니다. 그래서 적어도 외부에서 접근 가능한 일부 또는 전부를 만들 필요가 있다고 생각합니다. 또한, 'rend_service_t' 구조체는 유사한 처리가 필요한 몇 가지 다른 구조체를 집계 할 수 있습니다 ... –

0

귀하의 파일 control.c 컴파일하는 경우와 컴파일 오류가 생성됩니다. rendservice.c가 컴파일 전후에 컴파일되는지 여부는 중요하지 않습니다. 모든 컴파일러는 control.c와 헤더를 가져옵니다.

아마도 rend_service_t의 정의는 ifdef 섹션 내부에 있으므로 컴파일러는이를 건너 뜁니다. #define REND_SERVICE 또는 이와 비슷한 것이 필요할 것입니다 ... rendservice.h를보고 read_service_t 정의가 ifdef 블록 안에 있는지 확인하십시오.

+0

ifndefs/ifdefs를 확인했는데 헤더가 두 번 포함되지 않도록하는 유일한 존재는'#ifndef _TOR_RENDSERVICE_H ... #define _TOR_RENDSERVICE_H' 등 –