Я построил общий объект, чтобы позже использовать функцию 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)
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 -Wl,-rpath -Wl,'pwd' -o DoSomething DoSomething.cpp -I ../source/ -L. libMYSHAREDLIB.so
Iзатем можно просто вызвать программу по ./DoSomething
.
Проблема в том, что это не то, что я хочу.Я хочу скомпилировать новый файл проекта, такой как ./DoSomethingOnlyDependentOnMYSHAREDLIB
.Хотя я уже связываю header1.h
и header2.h
в MySharedLib.so
в файле Cmake:
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
)
Мне все еще нужна информация о директивах header1.h
и header2.h
во время компоновки и компиляции
-I ../source/
Как мне избежать этого?Я только хочу скопировать мой * .so куда-нибудь и создать новые вызовы функций в новых * .cpp только на основе MySharedLib.so (т.е. зависит только от одного файла).Большое спасибо за Вашу помощь!