编译、安装和使用FANN库(环境部署)
下载FANN的源代码
Github上面是官方的仓库,地址是libfann/fann。它大概已经有两年时间是2.2.0版本,目前还看不到有什么活跃的提交。
克隆主分支:
git clone --depth=1 https://github.com/libfann/fann.git
自定义安装路径编译、安装:
cd fann
cmake -DCMAKE_INSTALL_PREFIX=/home/az13js/opt/libfann .
make install
以上/home/az13js/opt/libfann
是可以根据情况定义的,默认是/usr/local
。可以在执行cmake命令之后打开产生的cmake_install.cmake
文件,第三行开始的:
# Set the install prefix
if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX "/home/az13js/opt/libfann")
endif()
反映了make install
执行后安装的位置。
执行官方示例代码
Github上源代码仓库里面的examples
文件夹里,有官方示例。
可以在终端cd
进入examples
,执行make命令编译这些示例,但是里面的Makefile是不支持make install
的。examples/Makefile
文件支持make all
、make clean
、make runtest
和make rundebugtest
等,可以反复执行make clean
和make runtest
。
更多支持的make参数可以打开examples/Makefile
查看,它并没有特别地复杂。
我查看了几个官方的位于examples
里面的示例文件,并检查了官方是如何使用Makefile
(这里指examples
里的)配置编译的,事实上执行make all
的时候也能看出:
$ make clean
$ make all
gcc -I ../src/include -L ../src/ -O3 xor_train.c -o xor_train -lfann -lm
gcc -I ../src/include -L ../src/ -O3 xor_test.c -o xor_test -lfann -lm
示例程序的编译是使用FANN源代码编译时产生的库文件而不是最终安装出来的库文件,那么官方自己的示例就可以在不安装FANN到特定目录时就能使用。但是正常使用一个库肯定不能像官方这样做了。
编写自己的程序并使用FANN
1 我的工程目录和代码
我同样采用CMake来管理我的项目。工程的结构如下所示:
FANN_TEST # 工程文件夹
|
|__ build # 构建用的,里面都是临时文件
| \_ .gitignore
|
\__ src # 存放源代码
|
|__ CMakeLists.txt # CMake的配置文件
|
\__ main.cpp # 主程序
文件内容如下:
CMakeLists.txt
# CMake 项目配置文件
# 这里的各项配置项用于控制 CMake 寻找源文件、编译源文件和链接对象文件等各个步骤的具体操作。
# 如果你熟悉 CMake 那么可以根据具体情况进行修改。
# 配置构建本项目所需的 CMake 最低版本
cmake_minimum_required(VERSION 3.10)
# 项目名称和版本号
project(fann_test VERSION 0.1)
# 检查 C++ 编译器的标准支持情况
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_STANDARD 11)
# 检查 C 编译器的标准支持情况
# set(CMAKE_C_STANDARD_REQUIRED True)
# set(CMAKE_C_STANDARD 11)
# 当前所有的 cpp 文件都编译到 fann_test
file(GLOB_RECURSE CPP_FILES ./ *.cpp)
add_executable(fann_test ${CPP_FILES})
# 指定生成可执行程序链接时需要的库
target_link_libraries(fann_test fann)
main.cpp
#include "floatfann.h"
#include "fann_cpp.h"
using namespace FANN;
int main()
{
unsigned int layers[] = {4, 3, 2};
unsigned int size = sizeof(layers) / sizeof(unsigned int);
neural_net network_layer(LAYER, size, layers);
neural_net network_shortcut(SHORTCUT, size, layers);
return 0;
}
2 配置环境变量,以支持GCC编译器找到自定义路径下的FANN。
$ export CFLAGS=-I/home/az13js/opt/libfann/include
$ export CXXFLAGS=-I/home/az13js/opt/libfann/include
$ export LDFLAGS="-L/home/az13js/opt/libfann/lib -Wl,-rpath=/home/az13js/opt/libfann/lib"
3 进行构建。
$ cd build
$ cmake ../src
$ cmake --build .
构建完成后检查生成的可执行程序:
$ ldd fann_test
应该可以看到libfann.so.2
找到自定义的路径:
libfann.so.2 => /home/az13js/opt/libfann/lib/libfann.so.2 (0x00007f68c9cc1000)
可以拷贝官方示例的xor_sample.cpp
的源码,执行后输出的内容的结尾差不多是:
Training network.
Max Epochs 300000. Desired Error: 0.001
Epochs 1. Current Error: 0.294767
Epochs 21. Current Error: 0.000820599
Testing network.
XOR test (-1, -1) -> -0.950481, should be -1, difference = 0.0495193
XOR test (-1, +1) -> +0.933838, should be +1, difference = 0.0661617
XOR test (+1, -1) -> +1, should be +1, difference = -0
XOR test (+1, +1) -> -0.956881, should be -1, difference = 0.043119
Saving network.
XOR test completed.