链接静态库
gcc版本:4:4.4.4-1ubuntu2 GNU Make 3.81
我有以下库名为net_api.a
和一些头文件即
network_set.h
我已将头文件包含在main.c文件的源代码中
#include
我在以下目录中有以下静态库和标头
./tools/net/lib/net_api.a ./tools/net/inc/network_set.h
在我的Makefile中,我尝试使用以下代码片段进行链接:
INC_PATH = -I tools/net/inc LIB_PATH = -L tools/net/lib LIBS = -lnet_api $(TARGET): $(OBJECT_FILES) $(CC) $(LDFLAGS) $(CFLAGS) $(INC_PATH) $(LIB_PATH) $(LIBS) $(OBJECT_FILES) -o $(TARGET) main.o: main.c $(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) -c main.c
但是,当我编译时,我得到以下错误:
network_set.h error: expected '=', ',', ';', 'asm' or '__attribute__' before 'network_String'
这里出了什么问题?
编译
您必须处理的第一个问题是代码未编译的原因。 您的network_set.h
标头中存在问题; 它在某种程度上不是自包含的,所以你必须在包含它之前包含其他东西,或者你必须以某种方式明确地配置它。 你的目标应该是让你的标题既自包含又是幂等的。
- 可以包含自包含而不包含任何其他标头
- 幂等元可以多次包含而不会引起混乱
通过确保它可以是源文件中包含的第一个标头然后干净地编译来实现自包含。 这意味着如果它使用某个function(例如, size_t
),那么它包含一个定义该function的标头(例如,
)。
通过包括一个头部保护来实现幂等性:
#ifndef HEADER_H_INCLUDED #define HEADER_H_INCLUDED ...main body of header... #endif /* HEADER_H_INCLUDED */
我使用以下脚本,称为chkhdr
,以确保标头是自包含和幂等的。
#!/bin/ksh # # @(#)$Id: chkhdr.sh,v 1.2 2010/04/24 16:52:59 jleffler Exp $ # # Check whether a header can be compiled standalone tmp=chkhdr-$$ trap 'rm -f $tmp.?; exit 1' 0 1 2 3 13 15 cat >$tmp.c <
例如:
chkhdr -Itools/net/inc tools/net/inc/network_set.h
链接
在适当的时候,在您修复了编译问题之后,您将遇到链接问题。 选项-lnet_api
查找名为libnet_api.so
或libnet_api.a
的库。
要与net_api.a
链接,您必须将文件的路径名传递给link命令:
LIB_DIR = ./tools/net/lib LIB_NET_API = net_api.a LIB_PATH = -L ${LIB_DIR} ${CC} ... ${LIB_DIR}/${LIB_NET_API} ...
显然,您可以为整个库的路径定义一个宏。 请注意我是如何根据宏LIB_DIR重新定义LIB_PATH的。
头文件network_set.h
具有必须首先包含的额外依赖关系,其中一个是network_String
的定义。 查看库文档或咨询作者以获取更多详细信息。
你没有展示你的LDFLAGS; 我认为它们是定义的,但你只是没有发布它们。 如果您要构建静态库,则必须包含“-static”。
如果您不知道它们是什么,请查看以“gcc”开头的编译器输出,并查看“-static”是否显示在那里。