0

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

opencv_生成的 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 文件所在的目录中,所以我做错了什么??....任何帮助==非常有价值=)

4

1 回答 1

2

-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。默认情况下,编译器会libTest.so在你指定的时候在当前库路径中寻找你的文件,-lTest不会被找到,所以-L需要这个参数。

于 2013-11-15T02:48:01.563 回答