在C中编译Tesseract OCR

时间:2018-04-28 13:43:03

标签: c tesseract

是否可以在不链接C ++标准库的情况下将Tesseract ORC编译为纯C?

我编写了Tesseract following the instructions here,它运行良好。但是当我将它与sample c program from the docs相关联时,它给了我以下错误:

  "std::__1::basic_streambuf<char, std::__1::char_traits<char> >::~basic_streambuf()", referenced from:
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::~basic_filebuf() in libtesseract.a(libtesseract_api_la-baseapi.o)
      std::__1::basic_filebuf<char, std::__1::char_traits<char> >::basic_filebuf() in libtesseract.a(libtesseract_api_la-baseapi.o)
  "std::__1::cin", referenced from:
      tesseract::TessBaseAPI::ProcessPagesInternal(char const*, char const*, int, tesseract::TessResultRenderer*) in libtesseract.a(libtesseract_api_la-baseapi.o)

显然,它试图链接C ++标准库。是否可以编译为纯c,没有C ++标准的lib?我想最终在没有标准lib支持的情况下为arm-7进行交叉编译。

这是我的makefile(不,答案不是将gcc转为g ++。我想编译为c):

CFLAGS = -c -Wall -I../src/api/ -I../src/ccstruct -I../src/ccutil -I../leptonica/src/ -I../leptonica/build/src

default: main

main.o: main.c
    gcc $(CFLAGS) -c main.c -o main.o

main: main.o
    gcc main.o ../leptonica/lib/nodebug/liblept.a ../src/api/.libs/libtesseract.a -o main

clean:
    -rm -f *.o
    -rm -f main

1 个答案:

答案 0 :(得分:1)

通常,C ++应用程序需要/依赖于C ++标准库的几种方式。因此,您应该提供依赖项,或者,如果您确实想要避免它,请静态链接它。另外,请避免静态链接标准库多次(如果基于C ++的几个依赖项需要它)。

话虽如此,你完全避免使用C ++标准库的下一个目标却更难了。您不仅需要提供C ++标准类型的替代实现,还需要提供相应的实现。 Tesseract似乎使用的功能(或修改库以避免使用它们);但你必须处理其他几个问题:异常,RTTI,启动代码和构造函数,调用编译器生成的特殊函数,如memcpy,链接到libgcc ...