如何编译此lib以供使用?

时间:2014-10-02 23:59:34

标签: c gcc linker

我是C编程的新手,我试图在Ubuntu 12.10上使用GCC编译this Simple training example

看起来不应该包含fann.h(如文件本身所述),所以我改为包含了fixedfann.h。

首次尝试(不包括,只是为了看看编译器要求的内容):

$ gcc main.c -o output 
/tmp/cckKyM92.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

fann_create_standard在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的任何引用...也没有函数_start,我也不知道是谁链接了这个{{ 1}} ...知道这里有什么问题吗?

- UPDATE2

好的,我使用Harmeet的Makefile获取了.o文件,现在我试图链接所有内容。 我使用crt1.o创建了main.o,我尝试了:

gcc -c main.c

( - lm为libmath,这是必要的)我得到了:

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

main.c:(.text+0xba): undefined reference to `fann_train_on_file' 位于fann_train_on_file,因此我尝试了:

fann_train_data.c

但我收到了很多gcc -o output main.o fann/fixedfann.o fann/fann_train_data.o -lm 个错误......:/

看起来multiple definition of...已经包含/关联,但如果是,为什么它没有找到fann_train_data.o

- UPDATE3

我仍然真的被困在这里......想知道这两行中哪些(如果有的话)应该有效?:

fann_train_on_file

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

- 更新Harmeet

输出结果为:

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

3 个答案:

答案 0 :(得分:1)

您可以使用ar制作静态库并使用它。

使用以下内容在Makefile文件夹下创建hello-fann-3/fann/ -

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

all: libfann.a

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

%.o: %.c
    gcc $(CFLAGS) $^

然后使用make中的hello-fann-3/fann/命令构建静态库。以上Makefile将生成libfann.a,您可以将其链接到您的计划。

使用以下内容在Makefile文件夹下创建hello-fann-3/ -

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) $^

然后使用make中的hello-fann-3/命令构建main程序。

main.c中,您必须包含fan.h之类的内容 -

#include "fann.h"

如果您不理解Makefile,可以在这里阅读 -

http://www.gnu.org/software/make/manual/html_node/index.html

答案 1 :(得分:1)

您只需要链接fann库。

  1. 如果您手动编译,请执行此操作

    gcc main.c -lfann -lm -o main
    

    然后像

    一样运行它
    ./main
    

    如果您使用的是Ubuntu并且遇到以下错误

      

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

    然后运行

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

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

答案 2 :(得分:0)

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

$ 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_train_on_file位于fann_train_data.c上,fixedfann.c包含该$ gcc fann/fixedfann.c main.c -Ifann/include -lm ,为什么它未定义?我不知道......:/

<强> - 更新

我意识到:

//#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"
如果我在fixedfann.c上评论标题,那么

将起作用:

{{1}}