Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 针对静态库的链接_C_Makefile - Fatal编程技术网

C 针对静态库的链接

C 针对静态库的链接,c,makefile,C,Makefile,gcc版本:4:4.4.4-1ubuntu2 GNU Make 3.81 我有以下名为net_api.a的库和一些头文件,例如 network_set.h 我已经在main.c文件的源代码中包含了头文件 #include <network_set.h> 在我的Makefile中,我尝试使用以下代码段进行链接: INC_PATH = -I tools/net/inc LIB_PATH = -L tools/net/lib LIBS = -lnet_api $(TARGET):

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

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

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

#include <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\u set.h有额外的依赖项,必须首先包括这些依赖项,其中之一是network\u字符串的定义。有关更多详细信息,请查看库文档或咨询作者。

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

您不显示LDFLAGS;我想它们已经定义好了,但是你没有发布它们。如果您是根据静态库进行构建,则它们必须包含-static


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

您不显示LDFLAGS;我想它们已经定义好了,但是你没有发布它们。如果您是根据静态库进行构建,则它们必须包含-static

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

Compiling 您必须处理的第一个问题是为什么代码没有编译。您的网络_set.h标头有问题;它在某种程度上不是自包含的,因此在包含它之前必须包含其他内容,或者必须以某种方式显式配置它。您的目标应该是使头部同时具有自包含性和幂等性

#!/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
可以包含自包含的文件,但前面没有任何其他标题 幂等元可以多次包含而不会引起混乱 通过确保它可以是源文件中包含的第一个头,然后干净地编译,可以实现自包含。这意味着,如果它使用一个功能,例如,size\t,那么它包括一个定义该功能的头,例如

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

#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
连接 在适当的时候,在修复编译问题之后,您将遇到链接问题。选项-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的。

您必须处理的第一个问题是为什么代码没有编译。您的网络_set.h标头有问题;它在某种程度上不是自包含的,因此在包含它之前必须包含其他内容,或者必须以某种方式显式配置它。您的目标应该是使头部同时具有自包含性和幂等性

#!/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
可以包含自包含的文件,但前面没有任何其他标题 幂等元可以多次包含而不会引起混乱 通过确保它可以是源文件中包含的第一个头,然后干净地编译,可以实现自包含。这意味着,如果它使用一个功能,例如,size\t,那么它包括一个定义该功能的头,例如

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

#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
连接 在适当的时候,在修复编译问题之后,您将遇到链接问题。选项-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的。

没有其他依赖项。我还有一个Windows32版本的静态库。i、 e.net_api.lib。它链接ok与运行windows xp的visual studio 2008。我不太熟悉使用Makefile链接静态。@ant2009:链接阶段将遇到的问题还没有解决;您尚未成功地将main.c编译为main.o。没有其他依赖项。我还有一个Windows32版本的静态库。i、 e.net_api.lib。它链接ok与运行windows xp的visual studio 2008。我不太熟悉使用Makefile链接静态。@ant2009:链接阶段将遇到的问题还没有解决;您尚未成功将main.c编译为main.o。能否在network\u set.h中共享“network\u Sting”声明?能否在network\u set.h中共享“network\u Sting”声明_ 赛特·h?