CRF++ 的官方地址: https://taku910.github.io/crfpp/
找到下载, 目前都是存在 google 云盘上面的.
下载最新版本, 现在是 0.58
下载源码包, CRF++-0.58.tar.gz
放到 Linux 服务器上面
运行命令
./configure
输出结果
- checking for a BSD-compatible install... /usr/bin/install -c
- checking whether build environment is sane... yes
- checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
- checking for gawk... gawk
- checking whether make sets $(MAKE)... yes
- checking for gcc... gcc
- checking whether the C compiler works... yes
- checking for C compiler default output file name... a.out
- checking for suffix of executables...
- checking whether we are cross compiling... no
- checking for suffix of object files... o
- checking whether we are using the GNU C compiler... yes
- checking whether gcc accepts -g... yes
- checking for gcc option to accept ISO C89... none needed
- checking for style of include used by make... GNU
- checking dependency style of gcc... gcc3
- checking for g++... g++
- checking whether we are using the GNU C++ compiler... yes
- checking whether g++ accepts -g... yes
- checking dependency style of g++... gcc3
- checking how to run the C preprocessor... gcc -E
- checking for grep that handles long lines and -e... /usr/bin/grep
- checking for egrep... /usr/bin/grep -E
- checking whether gcc needs -traditional... no
- checking whether make sets $(MAKE)... (cached) yes
- checking for library containing strerror... none required
- checking build system type... x86_64-unknown-Linux-gnu
- checking host system type... x86_64-unknown-Linux-gnu
- checking how to print strings... printf
- checking for a sed that does not truncate output... /usr/bin/sed
- checking for fgrep... /usr/bin/grep -F
- checking for ld used by gcc... /usr/bin/ld
- checking if the linker (/usr/bin/ld) is GNU ld... yes
- checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B
- checking the name lister (/usr/bin/nm -B) interface... BSD nm
- checking whether ln -s works... yes
- checking the maximum length of command line arguments... 1572864
- checking whether the shell understands some XSI constructs... yes
- checking whether the shell understands "+="... yes
- checking how to convert x86_64-unknown-Linux-gnu file names to x86_64-unknown-Linux-gnu format... func_convert_file_noop
- checking how to convert x86_64-unknown-Linux-gnu file names to toolchain format... func_convert_file_noop
- checking for /usr/bin/ld option to reload object files... -r
- checking for objdump... objdump
- checking how to recognize dependent libraries... pass_all
- checking for dlltool... no
- checking how to associate runtime and link libraries... printf %s\n
- checking for ar... ar
- checking for archiver @FILE support... @
- checking for strip... strip
- checking for ranlib... ranlib
- checking command to parse /usr/bin/nm -B output from gcc object... ok
- checking for sysroot... no
- checking for mt... no
- checking if : is a manifest tool... no
- checking for ANSI C header files... no
- checking for sys/types.h... yes
- checking for sys/stat.h... yes
- checking for stdlib.h... yes
- checking for string.h... yes
- checking for memory.h... yes
- checking for strings.h... yes
- checking for inttypes.h... yes
- checking for stdint.h... yes
- checking for unistd.h... yes
- checking for dlfcn.h... yes
- checking for objdir... .libs
- checking if gcc supports -fno-rtti -fno-exceptions... no
- checking for gcc option to produce PIC... -fPIC -DPIC
- checking if gcc PIC flag -fPIC -DPIC works... yes
- checking if gcc static flag -static works... no
- checking if gcc supports -c -o file.o... yes
- checking if gcc supports -c -o file.o... (cached) yes
- checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
- checking whether -lc should be explicitly linked in... no
- checking dynamic linker characteristics... GNU/Linux ld.so
- checking how to hardcode library paths into programs... immediate
- checking whether stripping libraries is possible... yes
- checking if libtool supports shared libraries... yes
- checking whether to build shared libraries... yes
- checking whether to build static libraries... yes
- checking how to run the C++ preprocessor... g++ -E
- checking for ld used by g++... /usr/bin/ld -m elf_x86_64
- checking if the linker (/usr/bin/ld -m elf_x86_64) is GNU ld... yes
- checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
- checking for g++ option to produce PIC... -fPIC -DPIC
- checking if g++ PIC flag -fPIC -DPIC works... yes
- checking if g++ static flag -static works... no
- checking if g++ supports -c -o file.o... yes
- checking if g++ supports -c -o file.o... (cached) yes
- checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries... yes
- checking dynamic linker characteristics... (cached) GNU/Linux ld.so
- checking how to hardcode library paths into programs... immediate
- checking for ANSI C header files... (cached) no
- checking for string.h... (cached) yes
- checking for stdlib.h... (cached) yes
- checking for unistd.h... (cached) yes
- checking fcntl.h usability... yes
- checking fcntl.h presence... yes
- checking for fcntl.h... yes
- checking for sys/stat.h... (cached) yes
- checking sys/mman.h usability... yes
- checking sys/mman.h presence... yes
- checking for sys/mman.h... yes
- checking sys/times.h usability... yes
- checking sys/times.h presence... yes
- checking for sys/times.h... yes
- checking ctype.h usability... yes
- checking ctype.h presence... yes
- checking for ctype.h... yes
- checking for sys/types.h... (cached) yes
- checking math.h usability... yes
- checking math.h presence... yes
- checking for math.h... yes
- checking pthread.h usability... yes
- checking pthread.h presence... yes
- checking for pthread.h... yes
- checking for size_t... yes
- checking for pow in -lm... yes
- checking for exp in -lm... yes
- checking for log in -lm... yes
- checking for pthread_create in -lpthread... yes
- checking for pthread_join in -lpthread... yes
- checking for stdlib.h... (cached) yes
- checking for unistd.h... (cached) yes
- checking for sys/param.h... yes
- checking for getpagesize... yes
- checking for working mmap... yes
- checking whether make is GNU Make... yes
- checking if g++ supports stl <string> (required)... yes
- checking if g++ supports stl <vector> (required)... yes
- checking if g++ supports stl <map> (required)... yes
- checking if g++ supports stl <set> (required)... yes
- checking if g++ supports stl <iostream> (required)... yes
- checking if g++ supports stl <fstream> (required)... yes
- checking if g++ supports stl <sstream> (required)... yes
- checking if g++ supports stl <stdexcept> (required)... yes
- checking if g++ supports template <class T> (required)... yes
- checking if g++ supports const_cast<> (required)... yes
- checking if g++ supports static_cast<> (required)... yes
- checking if g++ supports dynamic_cast<> (required)... yes
- checking if g++ supports exception handler (required)... yes
- checking if g++ supports namespaces (required) ... yes
- checking if g++ supports __thread (optional)... yes
- checking if g++ supports _SC_NPROCESSORS_CONF (optional)... yes
- checking if g++ environment provides all required features... yes
- configure: creating ./config.status
- config.status: creating Makefile
- config.status: creating Makefile.msvc
- config.status: creating swig/version.h
- config.status: creating config.h
- config.status: executing depfiles commands
- config.status: executing libtool commands
看到一连串的 yes 真的很舒服.
之后编译
- make
- sudo make install
安装 python 依赖, 进入子目录 python 中, cd python
- python setup.py build
- python setup.py install
此时, 调用 crf_train 或者在 python 中 import, 极大可能会遇到问题
libcrfpp.so.0: cannot open shared object file: No such file or directory
进入 python 来试一下
- python
- Python 3.7.2 (default, Dec 29 2018, 06:19:36)
- [GCC 7.3.0] :: Anaconda, Inc. on Linux
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import CRFPP
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- File "/home/xxx/.conda/envs/python37/lib/python3.7/site-packages/CRFPP.py", line 26, in <module>
- _CRFPP = swig_import_helper()
- File "/home/xxx/.conda/envs/python37/lib/python3.7/site-packages/CRFPP.py", line 22, in swig_import_helper
- _mod = imp.load_module('_CRFPP', fp, pathname, description)
- File "/home/xxx/.conda/envs/python37/lib/python3.7/imp.py", line 242, in load_module
- return load_dynamic(name, filename, file)
- File "/home/xxx/.conda/envs/python37/lib/python3.7/imp.py", line 342, in load_dynamic
- return _load(spec)
- ImportError: libcrfpp.so.0: cannot open shared object file: No such file or directory
真是让人头痛啊.
这里做了很多尝试
安装 libgcc
conda install libgcc
首先找到这个文件
sudo find ./ | grep libcrfpp.so.0
然后 copy 进入需要的目录
cp ./.libs/libcrfpp.so.0 /usr/local/lib/
建立软链
ln -s /usr/local/lib/libcrfpp.so.0 /usr/lib/
清除缓存
sudo rm -f /etc/ld.so.cache
共享动态链接库
sudo ldconfig
成功了
- python
- Python 3.7.2 (default, Dec 29 2018, 06:19:36)
- [GCC 7.3.0] :: Anaconda, Inc. on Linux
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import CRFPP
- >>>
来源: http://www.jianshu.com/p/61f716dd6539