小野寛生です。

cmake の問題ではありませんでした。

2017/11/13 Hiroo Ono (小野寛生) <hiroo.ono+free...@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@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-users-jp
To unsubscribe, send any mail to "freebsd-users-jp-unsubscr...@freebsd.org"

メールによる返信