C 如何编译此库以供使用?
我是C语言编程新手,我正试图在Ubuntu12.10上使用GCC进行编译 看起来不应该包含fann.h(如文件本身所述),因此我将fixedfann.h包含在内 第一次尝试(不包括,只是看看编译器会要求什么):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,然后进行链接(如果我有任何错误,请告诉我,我仍然不熟悉这种“链接”的东西) 所以我做了: $
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
!)是的,我正在运行