C ++在其他项目中使用共享库而不指定-I

时间:2018-10-03 15:04:32

标签: c++ shared-libraries header-files

我已经建立了一个共享库,以后可以在其他项目中使用该共享库中的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文件创建成功,即。 e。使用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 

然后可以正确地通过./DoSomething调用程序。

问题是,这不是我想要的。我想编译一个新的项目文件,例如./DoSomethingOnlyDependentOnMYSHAREDLIB。尽管我已经链接了Cmake文件中header1.h中的header2.hMySharedLib.so

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.hheader2.h指令的信息
-I ../source/ 

如何避免这种情况?我只想将我的* .so复制到某个地方,并仅基于MySharedLib.so在新的* .cpp中创建新的函数调用(即仅依赖于一个文件)。 非常感谢你的帮助!

0 个答案:

没有答案