[FreeBSD-users-jp 96168] Re: cmake と iconv.h
Hiroo Ono (小野寛生)
hiroo.ono+freebsd @ gmail.com
2017年 11月 14日 (火) 14:34:18 UTC
小野寛生です。
cmake の問題ではありませんでした。
2017/11/13 Hiroo Ono (小野寛生) <hiroo.ono+freebsd @ gmail.com>:
>> 小野寛生です。
>> 意図としては、/usr/include/iconv.h を include して libc にある iconv
>> を使いたいです。
>>
>> CMake を使うと /usr/local/include/iconv.h (GNU libiconv のやつ) を見つけて
>> そっちを読み込んでしまいます。
という問題ですが、
> それはともかく、 -I がどのような順序になるように生成されているのか、確認した方が良い気はします。
という指摘をいただいて確認したところ、
CMakeFiles/target.dir/flags.make:CXX_INCLUDES = -I /usr/local/include
-I/usr/home/hiroo/work/foo/src/target/../include
のようになっていて、CMakeLists.txt の target_include_directories で /usr/include を
指定してもしなくても変わりませんでした。
それ以前に、そもそも cc でも -I に /usr/include を指定しても無視されていました。
でもって、Cコンパイラの (少なくとも gcc や clang での) インクルードファイルの
検索順は、
1) -I で指定されたディレクトリ
2) -isystem で指定されたディレクトリ
3) システムディレクトリ (/usr/include はここ)
となっていて、/usr/local/include に libiconv の iconv.h がある場合に、
インクルードディレクトリに /usr/local/include を指定すると詰んでしまうようです。
FreeBSD の ports&package の場合ですが、libiconv には glib が依存していて、
これにいろんな ports が依存しているので、どれか一つでも入れるとひっかかります。
というわけで、glib なりそれに依存しているライブラリなりを使う場合は
> 3. GNU の軍門に下って libiconv を使う。
しかなさそうです。cmake は幸い libiconv ではなく icu を使っているので、
クリーンなやり方の順に
4') jail を使って libiconv をインストールしていない環境を用意してそこで
ビルドする。
5. #include "/usr/include/iconv.h" とやって使う。
> 4. (ビルド環境で) /usr/local/include/iconv.h を消す。
か ln -s /usr/include/iconv.h /usr/local/include/iconv.h とやる。
というあたりが結局解決方法なのかなと考えています。
freebsd-users-jp メーリングリストの案内