如何创建一个.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 相关?的主要内容,如果未能解决你的问题,请参考以下文章