Совместная библиотека C ++: создание и использование - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь построить общий объект, чтобы позже использовать функцию DoSomethingUseful() из общего объекта в других проектах.Он использует внешние библиотеки, а также несколько заголовков, которые я использую в нескольких проектах.

Используя CMake, я создал проект MySharedLib с заголовочным файлом с именем library.h:

#ifndef MYSHAREDLIB_LIBRARY_H
#define MYSHAREDLIB_LIBRARY_H



#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <cstdio>

// own header files
#include <header1.h>
#include <header2.h>

#define PI 3.14159265

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


//openCV 
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

//face detection
#include "opencv2/objdetect.hpp"
#include "opencv2/imgproc.hpp"

void DoSomethingUseul(int[] inparray);


#endif

с library.cpp как

#include "library.h"
void DoSomethingUseful(int[] inparray){...}

Мой файл CMakeкак таковой:

cmake_minimum_required(VERSION 3.10)
project(MYSHAREDLIB)

find_package( OpenCV REQUIRED )

set(CMAKE_CXX_STANDARD 11)

set(MY_INCLUDE_DIR ../source/)
set(MY_OPENCV_CASCADES /opencvpath/openCV34/opencv/sources/data/haarcascades/)
include_directories(${MY_INCLUDE_DIR} ${MY_OPENCV_CASCADES} /usr/include)

link_directories(${MY_INCLUDE_DIR})

add_library(MYSHAREDLIB SHARED library.cpp library.h
        ${MY_INCLUDE_DIR}header1.cpp
        ${MY_INCLUDE_DIR}header1.h
        ${MY_INCLUDE_DIR}header2.cpp
        ${MY_INCLUDE_DIR}header2.h
        )

set_target_properties(MYSHAREDLIB PROPERTIES VERSION 3.10)
set_target_properties(MYSHAREDLIB PROPERTIES SOVERSION 1)

target_link_libraries(MYSHAREDLIB lept tesseract ${OpenCV_LIBS})

Файл * .so создан успешно, т. е. с использованием Clion не выдается никаких ошибок и файл libMySharedLib.so находится там.

Однако, когда я хочу использовать функцию DoSomethingUseful() в другом файле DoSomething.cpp:

#include <iostream>
#include "library.h"

using namespace std;

int main()
{

    int[2] myarray; myarray[0]=1; myarray[1] =2;

    DoSomethingUseful(myarray);

    return 0;
}

И

 g++ -g -Wall -o DoSomething DoSomething.cpp -I ../source/ -L. libMYSHAREDLIB.so 

Когда я выполняю

./DoSomething

Я получаю:

./DoSomething: error while loading shared libraries: libMYSHAREDLIB.so: cannot open shared object file: No such file or directory

Раньше я компилировал без -I ../source/, что дает:

In file included from DoSomething.cpp:8:0:
library.h:19:10: fatal error: header1.h: No such file or directory
 #include <header1.h>

Я нахожу много потоков, связанных с этой проблемой в целом, и яИз этих проблем уже накоплено много знаний об общих объектах, а также удалось получить примеры из различных учебных пособий.Тем не менее, я не доволен своим собственным проектом.

Это только один из многих вопросов, но я надеюсь, что смогу получить помощь здесь и, возможно, также общие советы.Большое спасибо за любую помощь.

1 Ответ

0 голосов
/ 03 октября 2018

Предполагается, что Linux (измените вопрос, если ошибочный).При запуске исполняемого файла разделяемые библиотеки загружаются только из путей, указанных в /etc/ld.so.conf.Если вы хотите загрузить откуда-то еще (.), Вы должны установить переменную окружения LD_LIBRARY_PATH, например, LD_LIBRARY_PATH =../DoSomething

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...