在修改它之后,我遇到了编译Tor的问题。
在一个名为control.c
的文件中,我添加了一个引用名为rend_service_t
的结构的代码(位于rendservice.h
中)。我将rendservice.h
添加到control.c
的顶部,因为它之前没有包含它。
如果我尝试使用包含的Makefile,我会收到此错误:
control.c:2841: error: 'rend_service_t' undeclared (first use in this function)
我猜测rendservice.c
没有被包含或者没有被编译,所以我检查目录并且没有用于rendservice的目标文件。我有点困惑,因为它显然被包括在内。
是什么导致这种情况发生?
我还尝试修改Makefile.am/.in
,以便rendservice.c/h
出现在control.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;
...
答案 0 :(得分:1)
rend_service_t
是rendservice.c
专用的结构 - 它似乎不打算在.c文件之外使用,并且未在rendservice.h
中声明。 (请参阅rendservice.c
的版本,我在这里查看:https://doxygen.torproject.org/rendservice_8c_source.html)。
所以这不是一个包含头的问题 - 结构在头文件中根本没有显示。
您应该询问有关您打算使用struct rend_service_t
的内容的问题。
答案 1 :(得分:0)
正在编译您的文件control.c并且正在生成编译错误。是否在之前或之后编译rendservice.c无关紧要。所有编译器都看到的是control.c以及它所引入的任何头文件。
可能rend_service_t的定义在ifdef部分中,因此编译器正在跳过它。可能你需要#define REND_SERVICE或类似的东西...看看rendservice.h并查看read_service_t定义是否在ifdef块中。