Windowsでfmtlibのリンクエラー


#1

Choreonoid開発チームの皆様,

ご無沙汰しております.久しぶりにプルしてビルドしたことろ,Windowsでfmtlib関係でリンク時に未解決の外部シンボルでエラーになってしまいます.build\lib\Release\fmt.libはできています.確認をお願いいたします.


#2

正しいやり方かどうかわかりませんが,


の部分を

target_link_libraries(${target} ${OMNIORB_LIBRARIES} ${Boost_THREAD_LIBRARY} fmt) # omniDynamic4 

とすることにより解決しました.

しかし,VS2015では警告が6006個も出ています.そのうち,4117個が src/Util/Referenced.h です.

警告	C4099	'std::hash<cnoid::ref_ptr<T>>': タイプ名は最初 'struct' として使われていましたが 'class' として使われています
警告	C4099	'std::hash<cnoid::weak_ref_ptr<T>>': タイプ名は最初 'struct' として使われていましたが 'class' として使われています。

このままでも大丈夫ですか?


#3

src/Util/Referenced.hの207行と378行のclassstructに書き換えたところ,C4099の警告は出なくなり,ビルド時の出力がだいぶ静かになりました.これでいいのでしょうか?


#4

タイトルからずれてしまいますが,さらにWindows Visual Stdui 2015での報告です.

Boostの最新バージョン,1.69を使うとビルドエラーになります.

エラー	C2039	'libintl_snprintf': 'std' のメンバーではありません。 (ソース ファイルをコンパイルしています (中略)\choreonoid\src\Util\GettextUtil.cpp)	CnoidUtil	(中略)\boost_1_69_0\boost\system\detail\system_category_win32.hpp	52	

1.68では問題は置きません.system_category_win32.hpp の該当行の

    std::snprintf( buffer, len, "Unknown error (%d)", ev );

stdを削除するとビルドは通ります.ただし,これはboost側のファイルですので,直接書き換えるのは良くないと思います.

GettextUtil.cpp 側で対応できるでしょうか?


#5

本件ご指摘いただきありがとうございます。
すみません、個人的事情でしばらくこの掲示板をみることができていませんでした。(もうしばらくその状況が続くかもしれませんが、ご了承願いします。)

fmtlibのリンクエラーについては、リンクするように修正してコミットしてあります。

weak_ref_ptrの件もご指摘ありがとうございます。ご提案の修正について確認したいと思います。

boost 1.69を使用するとエラーになる件はこちらでも確認しました。これはboost側の問題かもしれませんので、当面は1.68を使用していただければと思います。

ちなみにboostについてインストールも大変ですし不具合の元にもなりやすいので、今後boostから脱却できるようにしたいと考えています。実はboost.formatからfmtlibへの移行についてもその一環として行っています。あとは、C++17になって、多くのboostのライブラリが標準ライブラリに取り込まれまして、C++17前提であれば後少しで脱却できそうです。標準ライブラリに含まれないものとしては、program_optionsなどがあり、そのあたりを他のものに置き換えることで、boostから脱却できると考えています。


#6

ref_ptrの警告の件について修正しておきました。また、他にもUtilとBaseのコンパイルで発生するいくつかの警告について出ないよう修正しました。