0

I have built a shared object to later use a function DoSomethingUseful() from the shared object in other projects. It uses external libraries as well as a bunch of headers that I am using across multiple projects.

Using CMake, I created a project MySharedLib with a header file called 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

With library.cpp as

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

My CMake file is as such:

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})

The *.so file is created sucessfully, i. e. using Clion, no errors are thrown and the file libMySharedLib.so is there.

I then want to use the function DoSomethingUseful() in another file 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;
}

And

g++ -g -Wall -Wl,-rpath -Wl,'pwd' -o DoSomething DoSomething.cpp -I ../source/ -L. libMYSHAREDLIB.so 

I can then call the programm by ./DoSomething just properly.

The problem is, that this is not what I want. I want to compile a new project file such as ./DoSomethingOnlyDependentOnMYSHAREDLIB. Although I already link header1.h and header2.h in MySharedLib.so in the Cmake file:

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
        )

I do still need the information of the directive of header1.h and header2.hduring linking and compiling by

-I ../source/ 

How can I avoid this? I only want to copy my *.so somewhere and create new function calls in new *.cpp's only based on MySharedLib.so (i. e. only dependent on one file). Thanks so much for your help!

0 Answers0