繁体   English   中英

链接到静态库

[英]Linking against a static library

gcc版本:4:4.4.4-1ubuntu2 GNU Make 3.81

我有以下名为net_api.a库和一些头文件,即

network_set.h

我在main.c文件的源代码中包含了头文件

#include <network_set.h>

我在以下目录中具有以下静态库和标头

./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具有额外的依赖关系,必须首先将其包括在内,其中之一是network_String的定义。 检查库文档或咨询作者以获取更多详细信息。

编译中

您必须处理的第一个问题是为什么代码无法编译。 您的network_set.h标头中存在问题; 它不是以某种方式自包含的,因此您必须在包含它之前先包含其他内容,否则必须以某种方式显式配置它。 您的目标应该是使标头既独立又幂等。

  • 可以包含包含的内容,而无需在其之前添加任何其他标头
  • 幂等可以多次包含而不会引起混乱

通过确保它可以成为源文件中包含的第一个标头,然后进行干净地编译,可以实现自包含。 这意味着,如果它使用功能(例如, size_t ),则它包含定义该功能的头(例如, <stddef.h> )。

幂等性是通过包含头保护器来实现的:

#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 <<EOF
#include HEADER /* Check self-containment */
#include HEADER /* Check idempotency */
int main(void){return 0;}
EOF

options=
for file in "$@"
do
    case "$file" in
    (-*)    options="$options $file";;
    (*)     echo "$file:"
            gcc $options -DHEADER="\"$file\"" -c $tmp.c
            ;;
    esac
done

rm -f $tmp.?
trap 0

例如:

chkhdr -Itools/net/inc tools/net/inc/network_set.h

连结中

在适当的时候,解决了编译问题后,您将遇到链接问题。 选项-lnet_api查找名为libnet_api.solibnet_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。

您不显示您的LDFLAGS; 我认为它们已定义,但您没有发布它们。 如果要针对静态库进行构建,则它们必须包含“ -static”。

如果您不知道它们是什么,请在以“ gcc”开头的开头查看编译器输出,然后查看是否在其中显示“ -static”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM