我在c中找到了这些库:http://svn.opendnssec.org/trunk/OpenDNSSEC/common/用于编码。我想用它们,但我不知道如何添加它们。
如果我添加#include "b64_ntop.c"
我在b64_ntop.c中遇到#include <config.h>
的问题(没有这样的文件或目录)。我该如何添加这些模块?
My makefile:
CC=gcc
CFLAGS=-std=gnu99 -Wall -pedantic
all: rdtclient
rdtclient: b64_ntop.o rdtclient.o
$(CC) $(CFLAGS) b64_ntop.o rdtclient.o -o rdtclient
感谢您的帮助
答案 0 :(得分:0)
你不应该#include
一个C档案。而是#include
compat.h并使用CFLAGS
选项在-I
中指定头文件的路径:
CFLAGS=-std=gnu99 -Wall -pedantic -Ipath/to/header
答案 1 :(得分:0)
对于该特定文件,您可以删除<stdlib.h>
以外的所有标头(abort()
所需),但您需要添加<stdint.h>
以获取uint8_t
。
#include <config.h> // Remove
#include <sys/types.h> // Remove
#include <sys/param.h> // Remove
#include <sys/socket.h> // Remove
#include <netinet/in.h> // Remove
#include <arpa/inet.h> // Remove
#include <ctype.h> // Remove
#include <stdio.h> // Remove
#include <stdlib.h> // Keep
#include <string.h> // Remove
#include <stdint.h> // Add
我无法看到其他人,而且我在测试时会与GCC一致。
我不确定引入了哪个标头uint8_t
;最有可能的是<sys/types.h>
,但C标准表示<stdint.h>
会这样做(或<inttypes.h>
这样做。)
您还应该有一个声明该函数的标头,并且该标头应包含在此文件中以确保函数声明和定义一致,并且标头应包含在使用该函数的每个源文件中。显然,这是源文件中的另一行#include
。
通常,如果文件使用<config.h>
(或更常见的是"config.h"
),则需要使用配置工具(通常为autoconf
或automake
)或者工具生成的configure
脚本,用于创建config.h
标头。在此文件中,没有受配置标头影响的条件代码,因此可以将其删除。
清理标题列表后,您可以像处理项目中的任何其他源文件一样处理该文件。最好将其编译为单独的目标文件(不需要特殊选项),并将其添加到构建中。那就是你的makefile
似乎做得非常好。有时,在另一个源文件中包含源文件(而不是头文件)是明智的或必要的。但是,合理的次数受到严格限制。