[FreeBSD-users-jp 96170] Re: cmake と iconv.h
内藤 祐一郎
naito.yuichiro @ gmail.com
2017年 11月 16日 (木) 12:15:25 UTC
内藤です。
コンパイラのオプションに -DLIBICONV_PLUG を渡して、
リンク時のオプションから -liconv を削除するのはどうでしょうか?
この場合、
#include <iconv.h>
で /usr/local/include/iconv.h が読み込まれてしまうのは
仕方がないとして諦めます。
/usr/local/include/iconv.h の中では通常
iconv_open -> libiconv_open
iconv -> libiconv
iconv_close -> libiconv_close
といった読み替えが行われています。
gnu iconv 側には読み替え後のシンボルも定義されているため、
/usr/local/include/iconv.h が読み込まれた場合、
gnu iconv 側の実装が呼び出されます。
LIBICONV_PLUG が定義されていると上記の読み替えが行われないため、
gnu iconv をリンクしなければ、
FreeBSD libc のシンボルでリンクが行われます。
もちろんこれは gnu iconv のヘッダでコンパイルしたオブジェクトを
FreeBSD iconv の関数とリンクするわけですから、
両方の定義が同じであると信じることになります。
iconv の規格は posix で決まっているため、
gnu 側も FreeBSD 側も同じインタフェースですので、
問題がないと*信じる*わけです。
実際、/usr/ports/Mk/Uses/iconv.mk を見てみると
これが同一であるとみなして使う例が書かれてますので、
いくつかの ports で実際に使われています。
だからと言って本当に安全か?というのは
アプリケーションの内容にもよりますので
一つの案としてお考えください。
> 2017/11/13 23:55、Hiroo Ono (小野寛生) <hiroo.ono+freebsd @ gmail.com>のメール:
>
> 小野寛生です。
>
> FreeBSD の話ではあんまりないのですが、ほかに聞けそうなところを思いつかないので
> すみません。
> ちょっとしたプログラムを書いていて CMake を使ってみたのですが、次の問題にぶつ
> かって悩んでいます。
>
> C++ のソースの中で
>
> #include <iconv.h>
>
> と書いて iconv を使いました。
> 意図としては、/usr/include/iconv.h を include して libc にある iconv
> を使いたいです。
>
> CMake を使うと /usr/local/include/iconv.h (GNU libiconv のやつ) を見つけて
> そっちを読み込んでしまいます。
> CMakeLists.txt の中で target_include_directories に /usr/include と
> /usr/local/include を書いて順番を前後してみたりしましたが変わりませんでした。
> /usr/local/include は boost を使いたいので参照したいのです。
> ports を作成している人は同じ問題にぶつかったことがあると思うのですが、
> どういう解決方法があるでしょうか。
>
> 1. cmake でなんとかする 方法が知りたいのですが、cmake のドキュメントで関係
> しそうなところを読んでも、web検索してもわからず、困っています。
>
> 2. cmake を捨てる。
> の場合にお薦めがありましたら教えてください。ports に入っているものがいいです。
> make を素で使えばいいじゃんというのもまあありなのですが、Linux に持って
> いったら面倒かもとか思っています。/usr/share/mk/bsd.*.mk を使わないと
> ちょっとめんどくさい程度にしか使えませんので。
> automake/autoconf は使いたくありません。
>
> 3. GNU の軍門に下って libiconv を使う。
> libc の中にあるものが使えるのに、余分なものに依存はあんまりしたくないなあ
> と思っています。(CMake は? と言われそう)
>
> 4. (ビルド環境で) /usr/local/include/iconv.h を消す。
> という解決策を書いている人がいました。Python の virtualenv に染まって
> しまって、libiconv を開発に使いたい人は自分の領域のところに libiconv
> を入れて使えばいいじゃんという気にはなるのですが、package がアップデート
> されるごとに問題が再燃するかなと。あと、それなら boost を自分専用に持てば
> と言われそうですね。
>
> 5. #include "/usr/include/iconv.h" とやって使う。
> なんか怒られそうですが、*BSD と Linux くらいしか考えず、別アーキテクチャ
> 向けのクロスビルドをしないなら、それで通るような気がしています。
> FreeBSD 以外での確認はしていませんが。
>
> というわけで、何かよい方法がありましたら教えてください。
> _______________________________________________
> 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-unsubscribe @ freebsd.org"
--
内藤 祐一郎
naito.yuichiro @ gmail.com
freebsd-users-jp メーリングリストの案内