【问题标题】:How do i create a .so file that contains only C++ code wrapped in C code - OpenCV related?如何创建一个.so 文件,其中仅包含用 C 代码包装的 C++ 代码 - OpenCV 相关?
【发布时间】: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 文件所在的目录中,所以我做错了什么??....任何帮助 == 非常有价值=)

【问题讨论】:

    标签: c++ c opencv wrapper


    【解决方案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 工作
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 2020-04-04
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多