【问题标题】:Linking against a static library链接到静态库
【发布时间】:2010-12-22 09:44:44
【问题描述】:

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 中,我尝试使用以下代码进行链接,代码 sn-p:

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_Sting'的声明吗?

标签: c makefile


【解决方案1】:

编译

您必须处理的第一个问题是代码无法编译的原因。您的network_set.h 标头有问题;它在某种程度上不是自包含的,因此您必须在包含它之前包含其他内容,或者您​​必须以某种方式显式配置它。您的目标应该是让您的标头既自包含又具有幂等性。

  • 自包含可以在没有任何其他标题的情况下包含在其前面
  • 幂等可以多次包含而不会造成混乱

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

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

#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 链接,您必须将文件的路径名传递给链接命令:

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。

【讨论】:

    【解决方案2】:

    标头network_set.h 具有必须首先包含的额外依赖项,其中之一是network_String 的定义。查看库文档或咨询作者了解更多详细信息。

    【讨论】:

    • 没有其他依赖。我还有一个 Windows 32 版本的静态库。即 net_api.lib。它可以与运行 windows xp 的 Visual Studio 2008 链接。我不太熟悉使用 Makefile 链接静态数据。
    • @ant2009:在链接阶段你还没有解决你将遇到的问题;你还没有成功地将 main.c 编译成 main.o。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多