Linux,C ++,共享库:使用Tesseract创建共享库

时间:2018-10-10 12:37:02

标签: c++ makefile shared-libraries tesseract

我想构建一个共享对象/共享库,以供以后的可执行文件使用。

我有一个带有自己的*.cpp以及相应的*.h文件的目录。 所有文件都与我的makefile-I.)位于同一目录中:

#makefile to create shared library w/o executable from own headers and tesseract

CC = g++

INCL = -I. -I/usr/include/tesseract/ -I/usr/include/leptonica/

CFLAGS= -Wall -g -c -fPIC

LDFLAGS = -shared


LIBS = libtesseract.a liblept.a

RM = rm -f

TARGET_LIB = libTargetLib.so

SRCS = *.cpp
OBJS = $(SRCS:.cpp=.o)

.PHONY: all
all: ${TARGET_LIB}

$(TARGET_LIB): $(OBJS)
        $(CC) $(LDFLAGS) $(INCL) -Wl,-rpath=/usr/lib/x86_64-linux-gnu/ -o $(TARGET_LIB) $^ -L/usr/lib/x86_64-linux-gnu/ -llept -ltesseract

$(OBJS): $(SRCS)
        $(CC) $(CFLAGS) $(SRCS)

我仔细检查了要链接的库文件libtesseract.aliblept.a在位置/usr/lib/x86_64-linux-gnu中。

我知道这个问题:ambiguous symbol File: tesscallback.h,所以我也注释了对应的行。

运行make时,出现此错误(更多行):

  

在/usr/include/tesseract/baseapi.h:34:0包含的文件中,                    来自file1.h:16,                    来自file1.cpp:4:/usr/include/tesseract/tesscallback.h:296:12:错误:预期   “ remove_reference”类型名称之前的嵌套名称说明符   remove_reference :: type p1_;               ^ ~~~~~~~~~~~~~~~ / usr / include / tesseract / tesscallback.h:296:12:错误:预期为“;”   成员声明结束   /usr/include/tesseract/tesscallback.h:296:28:错误:预期   “ <”令牌类型名称前的unqualified-id remove_reference :: type   p1_;                               ^ /usr/include/tesseract/tesscallback.h:在构造函数__ConstTessMemberResultCallback_1_0 :: __ ConstTessMemberResultCallback_1_0(const T *,   _ConstTessMemberResultCallback_1_0 :: MemberSignature,P1)’:/ usr / include / tesseract / tesscallback.h:301:29:错误:类   “ _ConstTessMemberResultCallback_1_0”没有任何内容   名为“ p1_”的字段          member_(成员),p1_(p1){}                                ^ ~~ /usr/include/tesseract/tesscallback.h:在成员函数‘virtual R   _ConstTessMemberResultCallback_1_0 :: Run()':/usr/include/tesseract/tesscallback.h:305:38:错误:“ p1_”不是   在此范围内声明          R结果=(object _-> * member _)(p1_);                                         ^ ~~ /usr/include/tesseract/tesscallback.h:308:38:错误:“ p1_”不是   在此范围内声明          R结果=(object _-> member _)(p1_);                                         ^ ~~ /usr/include/tesseract/tesscallback.h:在全局范围内:   /usr/include/tesseract/tesscallback.h:326:12:错误:预期   “ remove_reference”类型名称之前的嵌套名称说明符   remove_reference :: type p1_;               ^ ~~~~~~~~~~~~~~~ / usr / include / tesseract / tesscallback.h:326:12:错误:预期为“;”   成员声明结束   /usr/include/tesseract/tesscallback.h:326:28:错误:预期   “ <”令牌类型名称前的unqualified-id remove_reference :: type   p1_;                               ^ /usr/include/tesseract/tesscallback.h:在构造函数__ConstTessMemberResultCallback_1_0 :: __ ConstTessMemberResultCallback_1_0(const T 中,   _ConstTessMemberResultCallback_1_0 :: MemberSignature,P1)’:/usr/include/tesseract/tesscallback.h:331:29:错误:类   “ _ConstTessMemberResultCallback_1_0”没有   任何名为“ p1_”的字段          member_(成员),p1_(p1){}                                ^ ~~ /usr/include/tesseract/tesscallback.h:在成员函数'virtual中   void _ConstTessMemberResultCallback_1_0 :: Run()’:   /usr/include/tesseract/tesscallback.h:335:27:错误:“ p1_”不是   在此范围内声明          (object _-> * member _)(p1_);                              ^ ~~ /usr/include/tesseract/tesscallback.h:337:27:错误:“ p1_”不是   在此范围内声明          (object _-> * member _)(p1 _);

当我不将其注释掉时(即行仍然存在),我得到:

  

在/usr/include/tesseract/baseapi.h:34:0包含的文件中,                    来自process_houghlines.h:18,                    来自process_houghlines.cpp:3:/usr/include/tesseract/tesscallback.h:278:29:错误:   “ remove_reference”不是课程模板模板   struct remove_reference {typedef T类型; };                                ^ ~~~~~~~~~~~~~~~ / usr / include / tesseract / tesscallback.h:278:29:错误:重新定义   “结构remove_reference”   /usr/include/tesseract/tesscallback.h:277:29:注意:上一个   “ struct remove_reference”模板的定义   struct remove_reference {typedef T类型; };                                ^ ~~~~~~~~~~~~~~~ / usr / include / tesseract / tesscallback.h:296:12:错误:预期   “ remove_reference”类型名称之前的嵌套名称说明符   remove_reference :: type p1_;               ^ ~~~~~~~~~~~~~~~ / usr / include / tesseract / tesscallback.h:296:12:错误:预期为“;”   成员声明结束   /usr/include/tesseract/tesscallback.h:296:28:错误:预期   “ <”令牌类型名称前的unqualified-id remove_reference :: type   p1_;                               ^ /usr/include/tesseract/tesscallback.h:在构造函数__ConstTessMemberResultCallback_1_0 :: __ ConstTessMemberResultCallback_1_0(const T *,   _ConstTessMemberResultCallback_1_0 :: MemberSignature,P1)’:/ usr / include / tesseract / tesscallback.h:301:29:错误:类   “ _ConstTessMemberResultCallback_1_0”没有任何内容   名为“ p1”的字段          member_(成员),p1_(p1){}                                ^ ~~ /usr/include/tesseract/tesscallback.h:在成员函数‘virtual R   _ConstTessMemberResultCallback_1_0 :: Run()':/usr/include/tesseract/tesscallback.h:305:38:错误:“ p1_”不是   在此范围内声明          R结果=(object _-> * member _)(p1_);                                         ^ ~~ /usr/include/tesseract/tesscallback.h:308:38:错误:“ p1_”不是   在此范围内声明          R结果=(object _-> member _)(p1_);                                         ^ ~~ /usr/include/tesseract/tesscallback.h:在全局范围内:   /usr/include/tesseract/tesscallback.h:326:12:错误:预期   “ remove_reference”类型名称之前的嵌套名称说明符   remove_reference :: type p1_;               ^ ~~~~~~~~~~~~~~~ / usr / include / tesseract / tesscallback.h:326:12:错误:预期为“;”   成员声明结束   /usr/include/tesseract/tesscallback.h:326:28:错误:预期   “ <”令牌类型名称前的unqualified-id remove_reference :: type   p1_;                               ^ /usr/include/tesseract/tesscallback.h:在构造函数__ConstTessMemberResultCallback_1_0 :: __ ConstTessMemberResultCallback_1_0(const T 中,   _ConstTessMemberResultCallback_1_0 :: MemberSignature,P1)’:/usr/include/tesseract/tesscallback.h:331:29:错误:类   “ _ConstTessMemberResultCallback_1_0”没有   任何名为...的字段(重复发生的错误)

文件file1.hfile1.cpp

...
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h> 
...

...
#include "file1.h"
...

文件file2.hfile2.cpp

...
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h> 
...

...
#include "file2.h"
...

我什至不明白,为什么错误会有所不同,因为使用Tesseract的标头在范围上恰好相等,并且一次错误发生在一个文件中,而不是另一个文件。

非常感谢您的帮助。

0 个答案:

没有答案