我想构建一个共享对象/共享库,以供以后的可执行文件使用。
我有一个带有自己的*.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.a
和liblept.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.h
和file1.cpp
:
...
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
...
和
...
#include "file1.h"
...
文件file2.h
和file2.cpp
:
...
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
...
和
...
#include "file2.h"
...
我什至不明白,为什么错误会有所不同,因为使用Tesseract的标头在范围上恰好相等,并且一次错误发生在一个文件中,而不是另一个文件。
非常感谢您的帮助。