我编写了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
答案 0 :(得分:1)
通常,C ++应用程序需要/依赖于C ++标准库的几种方式。因此,您应该提供依赖项,或者,如果您确实想要避免它,请静态链接它。另外,请避免静态链接标准库多次(如果基于C ++的几个依赖项需要它)。
话虽如此,你完全避免使用C ++标准库的下一个目标却更难了。您不仅需要提供C ++标准类型的替代实现,还需要提供相应的实现。 Tesseract似乎使用的功能(或修改库以避免使用它们);但你必须处理其他几个问题:异常,RTTI,启动代码和构造函数,调用编译器生成的特殊函数,如memcpy
,链接到libgcc
...