gpt4 book ai didi

c - 链接静态库

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:36 25 4
gpt4 key购买 nike

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

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

network_set.h

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

#include <network_set.h>

我在以下目录中有以下静态库和 header

./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有问题 header ;它在某种程度上不是独立的,因此您必须在包含它之前包含其他内容,或者您​​必须以某种方式显式配置它。您的目标应该是让 header 既独立又幂等。

  • self-contained 可以包含在前面没有任何其他标题
  • 幂等可以多次包含而不会造成困惑

自包含是通过确保它可以成为源文件中包含的第一个 header 然后干净地编译来实现的。这意味着如果它使用一个特性(例如,size_t),那么它包含一个定义该特性的 header (例如,<stddef.h>)。

幂等性是通过包含一个 header guard 实现的:

#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.so 的库或 libnet_api.a .

链接net_api.a ,您必须将文件的路径名传递给链接命令:

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 的。

关于c - 链接静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4507896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com