Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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_Gcc_Linker - Fatal编程技术网

C 如何编译此库以供使用?

C 如何编译此库以供使用?,c,gcc,linker,C,Gcc,Linker,我是C语言编程新手,我正试图在Ubuntu12.10上使用GCC进行编译 看起来不应该包含fann.h(如文件本身所述),因此我将fixedfann.h包含在内 第一次尝试(不包括,只是看看编译器会要求什么): fann\u创建\u标准位于fann.h和fann.c上。由于fann.h包含在fixedfann.h中,而fann.h不应直接包含在内,因此我相信我必须编译fann.c和fixedfann.c,然后进行链接(如果我有任何错误,请告诉我,我仍然不熟悉这种“链接”的东西) 所以我做了: $

我是C语言编程新手,我正试图在Ubuntu12.10上使用GCC进行编译

看起来不应该包含fann.h(如文件本身所述),因此我将fixedfann.h包含在内

第一次尝试(不包括,只是看看编译器会要求什么):

fann\u创建\u标准
位于fann.h和fann.c上。由于fann.h包含在fixedfann.h中,而fann.h不应直接包含在内,因此我相信我必须编译fann.c和fixedfann.c,然后进行链接(如果我有任何错误,请告诉我,我仍然不熟悉这种“链接”的东西)

所以我做了:

$ gcc fann/fixedfann.c -o fann/fixedfann.o
fann/fixedfann.c:22:20: fatal error: config.h: No such file or directory
compilation terminated.
然后我做了:

$ gcc fann/fixedfann.c -o fann/fixedfann.o -include fann/include/config.h 
fann/fixedfann.c:22:20: fatal error: config.h: No such file or directory
compilation terminated.
现在,为什么在这里找不到config.h文件

--更新

谢谢@JonathanLeffler,我可以在这里迈出一些步伐。但现在我被困在:

$ gcc fann/fixedfann.c -o fann/fixedfann.o -I./fann/include/ -lm
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
而且,对于grep,我在fann文件夹中找不到任何对
main
的引用。。。也没有函数
\u start
,我不知道是谁在链接这个
crt1.o
。。。知道这里怎么了吗

--更新2

好的,我使用Harmeet的Makefile获得了.o文件,现在我正在尝试链接所有内容。 我用
gcc-cmain.c
创建了
main.o
,并尝试:

gcc -o output main.o fann/fixedfann.o -lm
(-lm用于libmath,这是必需的),我得到:

main.c:(.text+0xba): undefined reference to `fann_train_on_file'
这个
fann\u train\u on\u文件
fann\u train\u data.c
上,所以我尝试:

gcc -o output main.o fann/fixedfann.o fann/fann_train_data.o -lm
但是我得到了很多关于…的多重定义错误…:/

看起来像是
fann\u train\u data.o
已经包含/链接,但如果是这样,为什么它在\u文件中找不到
fann\u train\u

--更新3

我仍然被困在这里。。。你知道这两条线中哪一条(如果有的话)行得通吗

gcc -o output main.o hello.o fann/fixedfann.o fann/fann_train_data.o -lm

--Harmeet的更新

结果是:

$ make
gcc -L./fann -lfann main.o -o main
main.o: In function `main':
main.c:(.text+0x62): undefined reference to `fann_create_standard'
main.c:(.text+0x7a): undefined reference to `fann_set_activation_function_hidden'
main.c:(.text+0x8e): undefined reference to `fann_set_activation_function_output'
main.c:(.text+0xba): undefined reference to `fann_train_on_file'
main.c:(.text+0xce): undefined reference to `fann_save'
main.c:(.text+0xda): undefined reference to `fann_destroy'
collect2: ld returned 1 exit status
make: *** [main] Error 1

您可以使用
ar
创建一个静态库并使用它

在您的
hello-fann-3/fann/
文件夹下创建一个
Makefile
,包含以下内容-

SOURCES = $(wildcard *.c)
OBJECTS = $(SOURCES:.c=.o)
CFLAGS = -c -Iinclude

all: libfann.a

libfann.a: $(OBJECTS)
    ar rcs $@ $^

%.o: %.c
    gcc $(CFLAGS) $^
SOURCES = $(wildcard *.c)
OBJECTS = $(SOURCES:.c=.o)
CFLAGS = -c -I./fann/include
LFLAGS = -L./fann -lfann

main: $(OBJECTS)
    gcc $(LFLAGS) $^ -o $@

%.o: %.c
    gcc $(CFLAGS) $^
然后使用
hello-fann-3/fann/
中的
make
命令构建静态库。上面的
Makefile
将生成
libfann.a
,您可以链接到您的程序

hello-fann-3/
文件夹下创建一个
Makefile
,包含以下内容-

SOURCES = $(wildcard *.c)
OBJECTS = $(SOURCES:.c=.o)
CFLAGS = -c -Iinclude

all: libfann.a

libfann.a: $(OBJECTS)
    ar rcs $@ $^

%.o: %.c
    gcc $(CFLAGS) $^
SOURCES = $(wildcard *.c)
OBJECTS = $(SOURCES:.c=.o)
CFLAGS = -c -I./fann/include
LFLAGS = -L./fann -lfann

main: $(OBJECTS)
    gcc $(LFLAGS) $^ -o $@

%.o: %.c
    gcc $(CFLAGS) $^
然后使用
hello-fann-3/
中的
make
命令构建
main
程序

main.c
中,必须包括
fan.h
等-

#include "fann.h"
如果您不了解Makefile,可以在此处阅读-


一位同事帮助我,我们来到这一行,编译了所有内容,并制作了可执行文件:

$ gcc fann/fann.c fann/fann_io.c fann/fann_train.c fann/fann_train_data.c fann/fann_error.c fann/fann_cascade.c main.c -Ifann/include -lm
这就是答案

也就是说,这正是
fixedfann.c
正在做的事情(包括所有这些
.c
文件)。但如果我尝试:

$ gcc fann/fixedfann.c main.c -Ifann/include -lm
…我得到:

undefined reference to `fann_train_on_file'
fann\u train\u on\u文件
位于
fann\u train\u data.c
上,它包含在
fixedfann.c
中,为什么它没有定义?我不知道…:/

--更新

我意识到:

$ gcc fann/fixedfann.c main.c -Ifann/include -lm
如果我在fixedfann.c上对标题进行注释,则可以使用:

//#include "config.h"
//#include "fixedfann.h"

#include "fann.c"
#include "fann_io.c"
#include "fann_train.c"
#include "fann_train_data.c"
#include "fann_error.c"
#include "fann_cascade.c"

您只需要链接fann库

  • 如果手动编译,请执行此操作

    gcc main.c -lfann -lm -o main
    
    然后像这样简单地运行它

    ./main
    
    如果你在Ubuntu上遇到以下错误

    ./main:加载共享库时出错:libfann.so.2:无法打开共享对象文件:没有此类文件或目录

    然后跑

    sudo ldconfig
    
  • 如果您使用的是NetBeans,那么只需右键单击您的项目->属性->构建->链接器, 然后在库部分单击浏览按钮[…],然后在新窗口中单击添加库

    然后添加fann库(例如,我的fann库路径为:
    /usr/local/lib/libfann.a
    )并单击确定


  • 您可能需要
    -Ifann
    作为GCC命令行的额外参数。
    $GCC fann/fixedfann.c-o fann/fixedfann.c-include fann/include/config.h
    并且您过度编写了源文件?@wildplasser抱歉,我的意思是
    $gcc fann/fixedvann.c-o fann/fixedvann.o-include fann/include/config.h
    -我仍然收到了错误注意新的错误:注意我没有在我建议的
    -I./fann/include
    中包含
    config.h
    。创建对象文件时需要
    -c
    选项(例如
    fann/fixedfann.o
    。当您想要链接
    main.o
    (或
    main.c
    )时,请省略
    -c
    选项,并列出两个对象文件。即:
    gcc-c fann/fixedfann.c-o fann/fixedfann.o-I./fann/include/
    ;然后可能是
    gcc-o示例main.o fann/fixedfann.o-lm
    (没有为
    fann
    代码使用库,但您尚未创建它AFAICS)。谢谢你的帮助!但是我得到了
    Makefile:8:**缺少分隔符。停止。
    ar rcs$@$^
    这一行…不确定为什么…顺便问一下,这是递归的吗?@Tom Brito,在上面的Makefile中,
    ar
    gcc
    行必须以制表符开头。不能是空格!Makefile不是递归的。谢谢!我仍然在做一些错误的事情…我把Makefile放在了./src/fann文件夹中(标题在./src/fann/include中,我是否应该更改这个
    -Iinclude
    ?但是它编译了…,看起来编译起来没有问题…仍然,我得到了
    main.c:(.text+0x62):未定义对fann\u create\u standard“
    的引用,当我执行
    gcc-o输出fann/fann.a main.c
    时。此
    fann\u create\u standard
    位于fann.c:32上,我正在尝试查找我缺少的内容…@TomBrito,您是否正在运行从
    /src/fann//code>文件夹生成
    libfann.a
    命令像文件
    fann.c
    一样,文件没有编译成
    libfann.a
    (我编辑了上面的Makefile,将
    fann.a
    更改为
    libfann.a
    !)是的,我正在运行