Я хочу создать общий объект / общую библиотеку для последующего использования исполняемым файлом.
У меня есть каталог со своими *.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
Я дважды проверил.
Мне известна эта проблема: неоднозначный символ Файл: 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».^ ~~~~~~~~~~~~~~~ /usr/include/tesseract/tesscallback.h:296:12: ошибка: ожидается ';'в конце объявления члена /usr/include/tesseract/tesscallback.h:296:28: ошибка: ожидаемый неквалифицированный идентификатор перед именем <<'имя типа токена remove_reference :: type p1_;^ /usr/include/tesseract/tesscallback.h: в конструкторе '_ConstTessMemberResultCallback_1_0 :: _ ConstTessMemberResultCallback_1_0 (const T *, _ConstTessMemberResultCallback_1_0 :: MemberSignature, P0: error_1: 0): 0)::В классе '_ConstTessMemberResultCallback_1_0' нет ни одного поля с именем 'p1_' member_ (member), p1_ (p1) {} ^ ~~ /usr/include/tesseract/tesscallback.h: в функции-члене 'virtual R _ConstTessMemberResultCallback_1_0 :: Run ()': /usr/include/tesseract/tesscallback.h:305:38: ошибка:' p1_ 'не было объявлено в этой области R result = (object _-> * member _) (p1_);^ ~~ /usr/include/tesseract/tesscallback.h:308:38: ошибка: 'p1_' не было объявлено в этой области R result = (object _-> member _) (p1_);^ ~~ /usr/include/tesseract/tesscallback.h: в глобальном масштабе: /usr/include/tesseract/tesscallback.h:326:12: ошибка: ожидается спецификатор вложенного имени перед именем удаления remove_referencep1_;^ ~~~~~~~~~~~~~~~ /usr/include/tesseract/tesscallback.h:326:12: ошибка: ожидается ';'в конце объявления члена /usr/include/tesseract/tesscallback.h:326:28: ошибка: ожидаемый неквалифицированный идентификатор перед именем <<'имя типа токена remove_reference :: type p1_;^ /usr/include/tesseract/tesscallback.h: в конструкторе '_ConstTessMemberResultCallback_1_0 :: _ ConstTessMemberResultCallback_1_0 (const T </em>, _ConstTessMemberResultCallback_1_0 :: MemberSignback: 1: 33) :1ошибка: класс '_ConstTessMemberResultCallback_1_0' не имеет никакого поля с именем 'p1_' member_ (member), p1_ (p1) {} ^ ~~ /usr/include/tesseract/tesscallback.h: в функции-члене 'virtual void _ConstTessMemberResultCallback_1_0 ::() ': /usr/include/tesseract/tesscallback.h:335:27: ошибка:' p1_ 'не было объявлено в этой области (объект _-> * member _) (p1_);^ ~~ /usr/include/tesseract/tesscallback.h:337:27: ошибка: 'p1_' не было объявлено в этой области (объект _-> * member _) (p1 _);
КогдаЯ не комментирую это (то есть строки все еще там), я получаю:
В файле, включенном из /usr/include/tesseract/baseapi.h:34:0, из process_houghlines.h:18, из process_houghlines.cpp: 3: /usr/include/tesseract/tesscallback.h:278:29: error: 'remove_reference' не является шаблоном шаблона класса struct remove_reference {typedef T type;};^ ~~~~~~~~~~~~~~~ / usr / include / tesseract / tesscallback.h: 278: 29: ошибка: переопределение 'struct remove_reference' /usr/include/tesseract/tesscallback.h:277:29: примечание: предыдущее определение шаблона 'struct remove_reference' struct remove_reference {typedef T type;};^ ~~~~~~~~~~~~~~~ /usr/include/tesseract/tesscallback.h:296:12: ошибка: ожидание спецификатора вложенного имени перед именем «remove_reference» typename remove_reference :: type p1_;^ ~~~~~~~~~~~~~~~ /usr/include/tesseract/tesscallback.h:296:12: ошибка: ожидается ';'в конце объявления члена /usr/include/tesseract/tesscallback.h:296:28: ошибка: ожидаемый неквалифицированный идентификатор перед именем <<'имя типа токена remove_reference :: type p1_;^ /usr/include/tesseract/tesscallback.h: в конструкторе '_ConstTessMemberResultCallback_1_0 :: _ ConstTessMemberResultCallback_1_0 (const T *, _ConstTessMemberResultCallback_1_0 :: MemberSignature, P0: error_1: 0): 0)::класс '_ConstTessMemberResultCallback_1_0' не имеет никакого поля с именем 'p1' member_ (member), p1_ (p1) {} ^ ~~ /usr/include/tesseract/tesscallback.h: в функции-члене 'virtual R _ConstTessMemberResultCallback_1_0 :: Run ()': /usr/include/tesseract/tesscallback.h:305:38: ошибка:' p1_ 'не было объявлено в этой области R result = (object _-> * member _) (p1_);^ ~~ /usr/include/tesseract/tesscallback.h:308:38: ошибка: 'p1_' не было объявлено в этой области R result = (object _-> member _) (p1_);^ ~~ /usr/include/tesseract/tesscallback.h: в глобальном масштабе: /usr/include/tesseract/tesscallback.h:326:12: ошибка: ожидается спецификатор вложенного имени перед именем удаления remove_referencep1_;^ ~~~~~~~~~~~~~~~ /usr/include/tesseract/tesscallback.h:326:12: ошибка: ожидается ';'в конце объявления члена /usr/include/tesseract/tesscallback.h:326:28: ошибка: ожидаемый неквалифицированный идентификатор перед именем <<'имя типа токена remove_reference :: type p1_;^ /usr/include/tesseract/tesscallback.h: в конструкторе '_ConstTessMemberResultCallback_1_0 :: _ ConstTessMemberResultCallback_1_0 (const T </em>, _ConstTessMemberResultCallback_1_0 :: MemberSignback: 1: 33) :1ошибка: класс '_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"
...
Я даже не понимаю, почему ошибки различаются, поскольку заголовкиПо мере использования Тессеракт просто равен и один раз ошибка возникает в одном, чем в другом файле.
Большое спасибо за любую помощь.