回答編集履歴

2

エイリアスを用意する

2018/05/05 00:55

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -30,6 +30,10 @@
30
30
 
31
31
 
32
32
 
33
+ 名前だけの問題であれば、エイリアスを用意することで無理矢理使用することは出来ます(実際の例は後述)。ただし、名前が異なるだけではなく、内部の構造もコンパイル依存の所が存在するため、必ずうまくいくとは限りません。手動でエイリアスを用意するなどの苦労するばかりか、うまくいかなくて徒労に終わる可能性が高いため、推奨は出来ません。
34
+
35
+
36
+
33
37
  ---
34
38
 
35
39
 
@@ -49,3 +53,195 @@
49
53
  * OpenCV 3からCのAPIは非推奨になり、C++のAPIを使うことが推奨されています。しかし、CのAPIを使用できないわけではありません。
50
54
 
51
55
  * Cmakeは依存関係等を解決してMakefileやVisual Studioのプロジェクトファイルを作成するツールです。往年のautomakeに取って代わるツールですが、UNIX/Linux環境のみならず、WindowsでのVisual Studioにも対応しているなど、マルチプラットフォームなC/C++プログラムで特に使われるようになっているツールです。
56
+
57
+
58
+
59
+ ---
60
+
61
+
62
+
63
+ ### OpenCVの公式バイナリをMinGW GCCから無理矢理使う方法
64
+
65
+
66
+
67
+ MSYS2+MINGW64環境で実施します。GCCおよびdlltool等はインストール済みとします。また、VS2017のランタイムもインストール済みとします。特に明記しませんが、Windows 10の64bit環境です。`$`はシェルのプロンプトになります。
68
+
69
+
70
+
71
+ 1, 作業フォルダーにソースコード"sample.c"を置き、次のように書き換えます。(画像のファイル名を設定し、不要なヘッダを削除しただけです)
72
+
73
+
74
+
75
+ sample.c
76
+
77
+ ```C
78
+
79
+ #include <opencv2/opencv.hpp>
80
+
81
+
82
+
83
+ int main(void)
84
+
85
+ {
86
+
87
+ cv::Mat src_img;
88
+
89
+ src_img = cv::imread("sample.jpg", 1);
90
+
91
+ // 画像が読み込まれなかったらプログラム終了
92
+
93
+ if (src_img.empty()) return -1;
94
+
95
+
96
+
97
+ // 結果画像表示
98
+
99
+ cv::namedWindow("Image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
100
+
101
+ cv::imshow("Image", src_img);
102
+
103
+ cv::waitKey(0);
104
+
105
+ }
106
+
107
+ ```
108
+
109
+
110
+
111
+ 2, 適当なJPEGファイルを作業フォルダーにおいて、"sample.jpg"という名前にします。
112
+
113
+
114
+
115
+ 3, OpenCVのWindows版公式バイナリopencv-3.4.1-vc14_vc15.exeを実行し、Cドライブ直下にインストールします。"C:\opencv\build\x64\vc15\bin\opencv_world341.dll"を作業フォルダーにコピーします。
116
+
117
+
118
+
119
+ ```
120
+
121
+ $ cp /c/opencv/build/x64/vc15/bin/opencv_world341.dll .
122
+
123
+ ```
124
+
125
+
126
+
127
+ 4, 下記内容のDEFファイル"opencv_world341_gcc.def"を作成します。
128
+
129
+
130
+
131
+ opencv_world341_gcc.def
132
+
133
+ ```DEF
134
+
135
+ LIBRARY "opencv_world341.dll"
136
+
137
+ EXPORTS
138
+
139
+ ; cv::String::allocate(unsigned long long)
140
+
141
+ ?allocate@String@cv@@AEAAPEAD_K@Z
142
+
143
+ _ZN2cv6String8allocateEy==?allocate@String@cv@@AEAAPEAD_K@Z
144
+
145
+ ; cv::Mat::deallocate()
146
+
147
+ ?deallocate@Mat@cv@@QEAAXXZ
148
+
149
+ _ZN2cv3Mat10deallocateEv==?deallocate@Mat@cv@@QEAAXXZ
150
+
151
+ ; cv::fastFree(void*)
152
+
153
+ ?fastFree@cv@@YAXPEAX@Z
154
+
155
+ _ZN2cv8fastFreeEPv==?fastFree@cv@@YAXPEAX@Z
156
+
157
+ ; cv::imread(cv::String const&, int)
158
+
159
+ ?imread@cv@@YA?AVMat@1@AEBVString@1@H@Z
160
+
161
+ _ZN2cv6imreadERKNS_6StringEi==?imread@cv@@YA?AVMat@1@AEBVString@1@H@Z
162
+
163
+ ; cv::String::deallocate()
164
+
165
+ ?deallocate@String@cv@@AEAAXXZ
166
+
167
+ _ZN2cv6String10deallocateEv==?deallocate@String@cv@@AEAAXXZ
168
+
169
+ ; cv::namedWindow(cv::String const&, int)
170
+
171
+ ?namedWindow@cv@@YAXAEBVString@1@H@Z
172
+
173
+ _ZN2cv11namedWindowERKNS_6StringEi==?namedWindow@cv@@YAXAEBVString@1@H@Z
174
+
175
+ ; cv::imshow(cv::String const&, cv::_InputArray const&)
176
+
177
+ ?imshow@cv@@YAXAEBVString@1@AEBV_InputArray@1@@Z
178
+
179
+ _ZN2cv6imshowERKNS_6StringERKNS_11_InputArrayE==?imshow@cv@@YAXAEBVString@1@AEBV_InputArray@1@@Z
180
+
181
+ ; cv::waitKey(int)
182
+
183
+ ?waitKey@cv@@YAHH@Z
184
+
185
+ _ZN2cv7waitKeyEi==?waitKey@cv@@YAHH@Z
186
+
187
+ ```
188
+
189
+
190
+
191
+ 5, 下記コマンドを実行し、libopencv_world341.aを作成します。
192
+
193
+
194
+
195
+ ```
196
+
197
+ $ dlltool -D opencv_world341.dll -d opencv_world341_gcc.def -l libopencv_world341_gcc.a
198
+
199
+ ```
200
+
201
+
202
+
203
+ 6, 作成したライブラリにリンクしてコンパイルします。
204
+
205
+
206
+
207
+ ```
208
+
209
+ $ g++ -O2 -Wall -std=c++17 -I/c/opencv/build/include -L. sample.cpp -lopencv_world341_gcc -o sample.exe
210
+
211
+ ```
212
+
213
+
214
+
215
+ 7, MSYS2環境でsample.exeを実行できるか確認します。
216
+
217
+
218
+
219
+ ```
220
+
221
+ $ ./sample.exe
222
+
223
+ ```
224
+
225
+
226
+
227
+ 8, エクスプローラー上でも実行できるように依存関係のDLLをコピーしておきます。
228
+
229
+
230
+
231
+ ```
232
+
233
+ $ cp /mingw64/bin/libgcc_s_seh-1.dll .
234
+
235
+ $ cp /mingw64/bin/libstdc++-6.dll .
236
+
237
+ $ cp /mingw64/bin/libwinpthread-1.dll .
238
+
239
+ ```
240
+
241
+
242
+
243
+ 9, エクスプローラー上でsample.exeをダブルクリックすると画像が表示されます。
244
+
245
+
246
+
247
+ これで完了です。お疲れ様でした。シンボル名を調べるのは二度とやりたくないです。なお、この方法は必ずうまくいくとは限らず、今回はたまたまうまくいっただけに過ぎません。私もよくわかっていない(特にDEFファイルが未だによくわからない)ため、解説はありません。

1

OpenCVを使った。

2018/05/05 00:54

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  * OpenCV 3.4.1の公式バイナリのWindows版はVisual Studio 2015とVisual Studio 2017のVC++用にコンパイルされています。DLLおよびLIBはその二つから使えるようになっていますが、MinGW GCC等のVisual Studio以外のコンパイラから使用できるようにはなっていません(理由は上で述べたとおりです)。MinGW GCC用のバイナリは公式にはありません。
42
42
 
43
- * MSYS2にはOpenCVのバイナリパッケージ(mingw-w64-x86_64-opencvとmingw-w64-i686-opencv)が存在します。そちらを使えばMSYS2環境でのMinGW GCCでOpenCVをコンパイルすることは可能です。OpenCV自体をMSYS2上でコンパイルするためのパッチおよび手順もMSYS2のレポジトリに公開されています。
43
+ * MSYS2にはOpenCVのバイナリパッケージ(mingw-w64-x86_64-opencvとmingw-w64-i686-opencv)が存在します。そちらを使えばMSYS2環境でのMinGW GCCでOpenCVを使ったプログラムをコンパイルすることは可能です。OpenCV自体をMSYS2上でコンパイルするためのパッチおよび手順もMSYS2のレポジトリに公開されています。
44
44
 
45
45
  * OpenCVはCmakeを使うことを前提に設計されています。OpenCVをコンパイルする場合はCmakeを用いて依存関係を解決したMakefileやVisual Studioのプロジェクトファイルを作る必要があります。OpenCVを使うプログラムを作る場合も、Cmakeで依存関係を解決できるようにCmakeのファイルが用意されています。
46
46