编译、安装和使用FANN库(环境部署)

2023-11-14

编译、安装和使用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 allmake cleanmake runtestmake rundebugtest等,可以反复执行make cleanmake 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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译、安装和使用FANN库(环境部署) 的相关文章

随机推荐