我是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
答案 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库。
如果您手动编译,请执行此操作
gcc main.c -lfann -lm -o main
然后像
一样运行它./main
如果您使用的是Ubuntu并且遇到以下错误
./ main:加载共享库时出错:libfann.so.2:无法打开共享对象文件:没有这样的文件或目录
然后运行
sudo ldconfig
如果您使用的是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}}