

「Interface 2014年 1月号,
[ラズベリーパイ×カメラで本格派画像処理](http://shop.cqpub.co.jp/hanbai/books/MIF/MIF201401.html)」を読みながら、
Raspberry PI のカメラモジュールを OpenCV で動かそうとしています。

36ページの 「コンパイルと実行」のところを行っているのですが、 `CMakeLists.txt` を `cmake` した後に `＄make`
しようとすると

[code]

    Linking CXX executable simpleface
    /usr/bin/ld: CMakeFiles/simpleface.dir/simpleface.cpp.o: undefined reference to symbol 'clock_gettime@@GLIBC_2.4'
    //lib/arm-linux-gnueabihf/librt.so.1: error adding symbols: DSO missing from command line
    collect2: ld returned 1 exit status
    CMakeFiles/simpleface.dir/build.make:183: recipe for target 'simpleface' failed
    make[2]: *** [simpleface] Error 1
    CMakeFiles/Makefile2:63: recipe for target 'CMakeFiles/simpleface.dir/all' failed
    make[1]: *** [CMakeFiles/simpleface.dir/all] Error 2
    Makefile:75: recipe for target 'all' failed
    make: *** [all] Error 2
    
[/code]

と出てしまい `make` 出来ません…

「[Think RPI:OpenCV and Pi Camera Board](https://thinkrpi.wordpress.com/opencv-
and-pi-camera-board/)」のブログ記事も参照してみたのですが、やはり同じ様にエラーが出てしまいます。

どうすればよいか分かる方いらっしゃいましたらよろしくお願いします。


CC BY-SA 3.0
2015-01-22T07:47:26.800
5063
2015-01-26T03:05:11.243
2015-01-22T08:21:29.597
4978
7675
question
opencv raspberry-pi makefile
Raspberry PI プログラムの make で `undefined reference to symbol 'clock_gettime@@GLIBC_2.4'` エラー等が出る


ライブラリに差がでてるように見えますので、とりあえず。。

[code]

    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo rpi-update
    $ sudo reboot
    
[/code]

と実行してみて、再実行するのはのどうでしょう。(しばらく時間がかかります。)  
手元では [Using OpenCV with gcc and
CMake](http://docs.opencv.org/doc/tutorials/introduction/linux_gcc_cmake/linux_gcc_cmake.html)
は大丈夫でした。

ちなみに glibc のバージョンは以下のようになっています。

[code]

    $ /lib/arm-linux-gnueabihf/libc.so.6
    GNU C Library (Debian EGLIBC 2.13-38+rpi2+deb7u6) stable release version 2.13, by Roland McGrath et al.
    Copyright (C) 2011 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.
    There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    PARTICULAR PURPOSE.
    Compiled by GNU CC version 4.6.3.
    Compiled on a Linux 3.2.51 system on 2015-01-11.
    Available extensions:
            crypt add-on version 2.1 by Michael Glad and others
            GNU Libidn by Simon Josefsson
            Native POSIX Threads Library by Ulrich Drepper et al
            Support for some architectures added on, not maintained in glibc core.
            BIND-8.2.3-T5B
    libc ABIs: UNIQUE
    For bug reporting instructions, please see:
    <http://www.debian.org/Bugs/>.
    $
    
[/code]

## 追記

`2014-12-24-wheezy-raspbian.img` を使って綺麗な気持ちでやってみたところ、なんとなく出来てしまいました。

> (修正)最新の Raspbian を最初から使っているとなると、そもそも 2.13
> がスタートなので、下記はまったくの妄想なので取り下げます。(どうやって、 OpenCV を入れているのか？と、 そもそもの
> `CMakeLists.txt` を見ないと判断できんような気がしてきました。。)

~~やっていて気がついたのですが、雑誌が手元にないので想像になってしまいますが OpenCV をソースコードから make
して導入しているのではないでしょうか？  
であれば、エラーの原因は OpenCV のライブラリを作成した時の glibc のバージョンと、今の glibc
のバージョンに矛盾がでてしまっているような状態が現状だと妄想します。

他の依存ライブラリも影響しそうなので、OpenCV の make
のタイミング以外にも問題があるかもしれないので、なんとも言えませんが、妄想が正しいのであれば、~~

一旦、[ここなど](https://stackoverflow.com/questions/9276169/removing-all-installed-
opencv-libs#9278502) を参考にして、OpenCV を uninstall して、今の環境で再度 make
しなおすか、作成するプログラムが
[最新の機能](http://code.opencv.org/projects/opencv/wiki/ChangeLog) に依らないのであれば
Raspbian のバッケージ管理に任せてしまって、 `apt-get` にて 2.4.1 を使用することができます。(できました)

`apt-get` でいいなら、OpenCV の uninstall 後に、例えば、、

[code]

    $ sudo apt-get install libopencv-dev
    $ sudo apt-get install cmake
    
[/code]

などとすれば、、

[code]

    $ mkdir opencv_test
    $ cd opencv_test
    $ vi DisplayImage.cpp
    ...
    $ vi CMakeLists.txt
    ...
    $ cmake .
    -- The C compiler identification is GNU 4.6.3
    -- The CXX compiler identification is GNU 4.6.3
    -- Check for working C compiler: /usr/bin/gcc
    -- Check for working C compiler: /usr/bin/gcc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/pi/opencv
    $ make
    Scanning dependencies of target DisplayImage
    [100%] Building CXX object CMakeFiles/DisplayImage.dir/DisplayImage.cpp.o
    Linking CXX executable DisplayImage
    [100%] Built target DisplayImage
    $
    
[/code]

(`DisplayImage.cpp` と `CMakeLists.txt` は上記 [Using OpenCV with gcc and
CMake](http://docs.opencv.org/doc/tutorials/introduction/linux_gcc_cmake/linux_gcc_cmake.html)
のままです。)  
みたいなことは出来るようになると思います。


CC BY-SA 3.0
2015-01-22T09:09:41.860
5071
2015-01-26T03:05:11.243
2017-05-23T12:38:55.307
-1
2992
5063
answer


[Realtime
Extensions](http://www.unix.org/version2/whatsnew/realtime.html)を使っているようですが、CMakeLists.txtの設定でrtはリンク対象に入ってますでしょうか？  
CMakeLists.txtに

[code]

    target_link_libraries( ... rt ...)
    
[/code]

のように、rtがなければRealtime Extensions(clock_gettime)は使えないと思います。

librt.so自体が存在するかどうかも一応確認してみてください。


CC BY-SA 3.0
2015-01-25T06:13:11.663
5239
2015-01-25T06:13:11.663
7409
5063
answer