살군의 보조기억 장치

Another memory device…

CV_EXPORTS

leave a comment »

OpenCV 의 코드 시작점을 테스트 코드로 잡았기 때문에 opencv/modules/ts/include/opencv2/ts/ts.hpp 로 잡았다. 테스트 코드의 헤더파일이다. 처음 보니까 생소한 것들이 몇가지 있다. 그 가운데 가장 먼저 눈에 띈 것이 CV_EXPORTS 매크로다. 소스코드에서 보면 여기에서 처음으로 나오는데 이게 뭐하는거지 싶었다.

namespace cvtest
{

using std::vector;
using std::string;
using cv::RNG;
using cv::Mat;
using cv::Scalar;
using cv::Size;
using cv::Point;
using cv::Rect;

class CV_EXPORTS TS;

CV_EXPORTS int64 readSeed(const char* str);

CV_EXPORTS void randUni( RNG& rng, Mat& a, const Scalar& param1, const Scalar& param2 );

inline unsigned randInt( RNG& rng )
{
    return (unsigned)rng;
}

inline  double randReal( RNG& rng )
{
    return (double)rng;
}

위의 코드에서 보다시피 눈에 확~ 띈다. CV_EXPORTS 매크로는

#if (defined WIN32 || defined _WIN32 || defined WINCE) && defined CVAPI_EXPORTS
#  define CV_EXPORTS __declspec(dllexport)
#else
#  define CV_EXPORTS
#endif

와 같이 정의되어 있다. 윈도우 기반의 시스템에서 컴파일 할 때, __declspec(dllexport) 로 변경이 되는 것이다.

__declspec(dllexport) 는 dll 의 라이브러리를 작성할 때, dll 내부에서 선언하고 정의한 함수를 외부에서 사용할 것이라고 알려주는 keyword 이다. 이는 microsoft 자체적으로 정의한 규격이며, 자세한 사항은 MSDN 에서 확인할 수 있다. 마찬가지로 __declspec(dllimport) 라는 것도 있는데, 이는 내가 선언하고 정의한 함수에 대해 dll 이 사용할 것이라고 알려주는 것이다.

윈도우에서 사용할 함수에 대해서는 CV_EXPORTS 를 선언해야지 윈도우 환경에서 link error 가 발생하지 않는다. 만일 Python, Java, 혹은 다른 언어에서도 사용할 수 있게하기 위해서는 CV_EXPORTS_W 를 사용해야 한다. 이때 오버로드overload 함수나 메소드들과 충돌이 나지 않게 주의를 해야한다. 요약하면, cpp 에서만 사용할 외부노출 함수는 CV_EXPORTS를 사용하고, 타 언어로 노출할 함수에 대해서는 CV_EXPORTS_W를 사용한다.

All external functions and classes must use CV_EXPORTS, otherwise there will be linking errors on Windows. For functions/classes which you want to expose in Python, Java etc. you should use CV_EXPORTS_W instead of CV_EXPORTS, but please be careful with overloaded functions and methods, with non-standard parameter types etc.

참고사이트
Advertisements

Written by gomiski

2014/02/04 at 5:15 pm

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: