C ++共享库:创建和使用

时间:2018-10-03 10:32:17

标签: c++ shared-libraries

我正在尝试构建共享对象,以便以后在其他项目中使用共享对象中的函数function selectHider() { var checkBox = document.getElementById("checkerBox"); //You can set disable default here, depend on your logic document.getElementById("selection").setAttribute("disabled", "disabled"); if (checkBox.checked == true){ document.getElementById("selection").removeAttribute("disabled"); } } 。 它使用外部库以及我在多个项目中使用的一堆标题。

使用CMake,我创建了一个项目MySharedLib,其头文件名为     DoSomethingUseful()

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

我的CMake文件是这样的:

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

*。so文件创建成功,即。 e。使用Clion,不会引发任何错误,并且文件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}) 在那里。

但是,当我想在另一个文件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/

我发现有很多线程通常都在处理这个问题,并且我已经从这些问题中收集了很多有关共享对象的知识,还可以从正在运行的各种教程中获取示例。  但是,我没有提出自己的项目。

这只是许多问题之一,但我希望我能在这里获得帮助,也可以提供一般提示。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

假设使用Linux(如果错误,请修改问题)。运行可执行文件时,共享库仅从/etc/ld.so.conf中列出的路径加载。如果要从其他地方(。)加载,则必须设置LD_LIBRARY_PATH环境变量,例如 LD_LIBRARY_PATH =。 ./DoSomething