c++ - C++ 共享库:创建和使用
问题描述
我正在尝试构建一个共享对象,以便以后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>
我发现很多线程通常都在处理这个问题,并且我已经从这些问题中收集了很多关于共享对象的知识,也成功地从各种运行的教程中获取了示例。但是,我自己的项目没有成功。
这只是众多问题之一,但我希望我能在这里得到帮助,也许还能得到一般提示。非常感谢您的帮助。
解决方案
假设 Linux(如果错误,请修改问题)。运行可执行文件时,共享库仅从 /etc/ld.so.conf 中列出的路径加载。如果你想从其他地方加载 (.) ,你必须设置 LD_LIBRARY_PATH 环境变量,例如LD_LIBRARY_PATH=。。/做一点事
推荐阅读
- php - 从购物车和结帐页面中删除 WooCommerce 订阅间隔
- java - 从客户端的内存中加载 Java 类
- oracle - 存储过程每次运行都会在同一个会话中启动 logminer
- python - 使用 tkinter 切换帧
- django - Django:如何向内置的用户模型添加一个多对多字段(从用户到用户本身)
- android - 尝试从我的 android 服务调用 web 服务时出现 android.os.NetworkOnMainThreadException 异常?
- r - 带有表达式的ggplot2:条件上标 scale_*_discrete 中的刻度标签
- reactjs - 在创建 React 应用程序时,进程停止并显示 4983 低严重性漏洞(运行 npm audit 来修复它们)
- sql - 将带有数据的oracle-dmp翻译成sql文件
- java - 尝试使用 spy 进行测试时出现空指针错误