53923


以下のtest.cppファイルを

[code]

    #include <opencv2/opencv.hpp>
    int main(){
        cv::Mat a = cv::imread("test.jpg", 1); 
        cv::imshow("hello", a); 
        cv::waitKey();
    }
    
[/code]

次のように実行したところ、  
`c++ -std=c++14 test.cpp -I/usr/local/Cellar/opencv/4.0.1/include/opencv4`  
次のようなエラーが出て実行できませんでした。

[code]

    Undefined symbols for architecture x86_64:
      "cv::Mat::deallocate()", referenced from:
          cv::Mat::release() in test-4fd227.o
      "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int)", referenced from:
          _main in test-4fd227.o
      "cv::imshow(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, cv::_InputArray const&)", referenced from:
          _main in test-4fd227.o
      "cv::waitKey(int)", referenced from:
          _main in test-4fd227.o
      "cv::fastFree(void*)", referenced from:
          cv::Mat::~Mat() in test-4fd227.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    
[/code]

`/usr/local/Cellar/opencv/4.0.1/include/opencv4`にはopencv2フォルダがあり、中にはopencv.hppを含んだ大量のhppファイルがあるので、おそらくopenCVの本体だと思っています。

どうすれば動くようになりますか？

## 環境

macOS Mojave 10.14.2  
通常のc++コードはコンパイル＆実行できる。  
brew経由でインストール

## 2019 3/29 0:20追記

  * `/usr/local/Cellar/opencv/4.0.1/lib`にはlibade.aとかlibopencv_aruco.4.0.1.dylibといった名前のファイルがありますが、この場所がライブラリパスでしょうか？
  * `c++ -std=c++14 test.cpp -I/usr/local/Cellar/opencv/4.0.1/include/opencv4 -I/usr/local/Cellar/opencv/4.0.1/include/opencv4/opencv2 -L/usr/local/Cellar/opencv/4.0.1/lib`を実行しても同じエラーが出てしまいます…

## 2019 4/4 14:33追記

  * `/usr/local/Cellar/opencv/4.0.1/lib/pkgconfig`というフォルダがあり、中に`opencv4.pc`だけ入っている。

## 2019 4/6 20:42追記

  * 以下の手順で解決に至った。
  * 環境変数`PKG_CONFIG_PATH`が作られてなかったので、`~/.bash_profile`に`exportPKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"`を追加。


CC BY-SA 4.0
2019-03-27T13:26:10.667
53767
2019-04-06T11:53:20.410
2019-04-06T11:53:20.410
30800
30800
question
c++ macos opencv
MacOS c++でopenCVが実行できない


"/usr/local/Cellar/opencv/4.0.1/include/opencv4にはopencv2フォルダがあり、中にはopencv.hppを含んだ大量のhppファイルがある"

・".hpp"というファイル拡張子はC++のヘッダーファイルですので、それが大量にあるフォルダーはヘッダファイルへのパスであるインクルードパスに含めるべきものと思われます。

・ヘッダファイルはC++のプログラムの本体ではありませんから、「おそらくopenCVの本体だと」というのは正しくない可能性が高いと思います。

・”Undefined symbols
”のエラーが起きるのは、個々のC++プログラムをコンパイルした後に、コンパイルされたコードやライブラリを統合（リンク）して実行プログラムを生成する段階ですから、問題は必要なライブラリが無い、もしくはライブラリのパスに問題があるのだと思われます。

＝＝  
以上の観測から、  
１）C++のオプションにライブラリパスを追加する (-Lオプション）  
２）念のためインクルードパスにopencvフォルダーも含める  
"-I/usr/local/Cellar/opencv/4.0.1/include/opencv4/opencv2" も指定する。

を試してみては如何でしょう


CC BY-SA 4.0
2019-03-28T00:29:23.210
53775
2019-03-28T00:29:23.210
217
53767
answer


ヘッダファイルの場所を指定すために `-I`、  
ライブラリの場所を指定するために `-L`、  
リンクするライブラリを指定するために `-l` (小文字エル) が必要です。

[code]

    c++ -std=c++14 test.cpp -I/usr/local/Cellar/opencv/4.0.1/include/opencv4 \
        -L/usr/loal/Cellar/opencv/4.0.1/lib \
        -lopencv_highgui -lopencv_imgcodecs -lopencv_core
    
[/code]

こんなフラグをいちいち指定していては面倒すぎるので、`pkg-config` という便利な仕組みがあります。

[code]

    brew install pkg_config
    
[/code]

とすると、`/usr/local/lib/pkgconfig/` に `opencv4.pc` が作成されているはずです。

[code]

    pkg-config --cflags opencv4
    
[/code]

を実行するとOpenCVを利用したビルドに必要な`-I`フラグを表示します。

[code]

    pkg-config --libs opencv4
    
[/code]

を実行するとOpenCVを利用したビルドに必要な`-L`と`-l`を表示します。  
これらを利用して、

[code]

    c++ -std=c++14 test.cpp `pkg-config --cflags opencv4` `pkg-config --libs opencv4`
    
[/code]

と書けば長いパスをいちいち書かず、ライブラリ名を気にせずにビルドすることができます。


CC BY-SA 4.0
2019-04-04T14:57:26.690
53923
2019-04-04T14:57:26.690
3475
53767
answer