如何创建一个.so 文件,其中仅包含用 C 代码包装的 C++ 代码 - OpenCV 相关?

Posted

技术标签:

【中文标题】如何创建一个.so 文件,其中仅包含用 C 代码包装的 C++ 代码 - OpenCV 相关?【英文标题】:How do i create a .so file that contains only C++ code wrapped in C code - OpenCV related? 【发布时间】:2013-11-15 00:56:43 【问题描述】:

在使用 g++ 的 Ubuntu Saucy 64 位终端上,我试图将 OpenCV 包装成一种没有强大 C++ ffi 的语言,所以我试图使用 C++ 到 C 包装器来帮助做到这一点......这是文件的一小部分我尝试转换只是为了感受一下(opencv_generated.hpp 和 opencv_generated.cpp 在此链接https://github.com/arjuncomar/opencv-raw)

opencv_generated hpp:

#include <opencv2/opencv.hpp>
#include <vector>
#ifndef __OPENCV_GENERATED_HPP
#define __OPENCV_GENERATED_HPP
using namespace cv;
using namespace std;
using namespace flann;
using namespace cvflann;
extern "C" 
Mat* cv_imread(String* filename, int flags);
void cv_imshow(String* winname, Mat* mat);
bool cv_imwrite(String* filename, Mat* img, vector_int* params);

opencv_generated.cpp:

#include "opencv_generated.hpp"
using namespace cv;
using namespace std;
using namespace flann;
using namespace cvflann;
extern "C" 

Mat* cv_imread(String* filename, int flags) 
   return new Mat(cv::imread(*filename, flags));

void cv_imshow(String* winname, Mat* mat) 
   cv::imshow(*winname, *mat);

bool cv_imwrite(String* filename, Mat* img, vector_int* params) 
   return cv::imwrite(*filename, *img, *params);

我是 C++ 的 C 包装器的新手,正在尝试使用

进行编译
   g++ -Wall -dynamiclib  -I/home/w/test/opencv_generated.hpp 
  -I/home/w/test/opencv_generated.cpp  -o test.so

我遇到错误:

g++: fatal error: no input files

...我在我的 opencv_generated.cpp 和 opencv_generated.hpp 文件所在的目录中,所以我做错了什么??....任何帮助 == 非常有价值=)

【问题讨论】:

【参考方案1】:

编译器的-I 参数只能是您希望包含的目录的路径,不一定是文件。此外,您的第二个 -I 参数似乎是您要编译的源文件,因此您不必在此之前添加任何内容。如果您与两个 .hpp 和 .cpp 文件位于同一目录中,则您也不必为 opencv_generated.hpp 文件指定包含目录 - 您可以使用以下命令进行编译:

g++ -Wall -shared -fPIC -o libTest.so opencv_generated.cpp

但是,如果您在另一个目录中和/或您的源代码 + 头文件分散在各处,您可能必须像最初发布的那样使用绝对路径编译您的源代码:

g++ -Wall -shared -fPIC -o libTest.so -I/home/w/test/ /home/w/test/opencv_generated.cpp

此外,如果您将您编写的另一个程序(例如 main.cpp)链接到此共享库并且与它位于同一目录中,您将运行:

g++ -Wall main.cpp -L/home/w/test/ -lTest

其中/home/w/test/ 包含文件libTest.so。默认情况下,当你指定-lTest时,编译器会在当前库路径中寻找你的libTest.so文件,不会找到,所以需要-L参数。

【讨论】:

非常感谢... g++ -Wall -shared -fPIC -o opencv_generated.so opencv_generated.cpp 工作

以上是关于如何创建一个.so 文件,其中仅包含用 C 代码包装的 C++ 代码 - OpenCV 相关?的主要内容,如果未能解决你的问题,请参考以下文章

Lua 模块与包 调用c程序.so文件

我应该如何构建包含 Cython 代码的 Python 包

如何创建仅包含私钥/公钥之一的 .pfx 文件

android代码生成jar包

如何在 C 中设置 SO_RCVTIMEO 选项仅用于读取而不用于接受

apktool逆向apk包