質問: Log::getLogger(); logger.warn("Storm is coming"); return 0; } ``` ■Log4cppのPropertyConfiguratorImple.cpp(Log4cppをネットからダウンロード) ``` #include "PortabilityImpl.hh" #include #include "PropertyConfiguratorImpl.hh" namespace log4cpp { void PropertyConfigurator::configure(const std::string& initFileName) throw (ConfigureFailure) { PropertyConfiguratorImpl configurator; configurator.doConfigure(initFileName); } } ``` ■質問内容1 今回の発生事象は、上記のinitFileNameに意図した 文字列「log4cpp.properties」が入ってきていない ことが原因と考えていますが、あってますでしょうか。 (見当違いな調査をしていないかという点で確認です。) ■質問内容2 「<文字列の文字の読み取り中にエラーが発生しました。>」というのは、 なぜ発生するのでしょうか。 また、Debugで出来ていてReleaseで出来ていないのは なぜでしょうか。 ■質問内容3 今回の質問とは関連がないですが、VC++でDebugやReleaseした場合、 以下のようなフォルダ構成になりますが、 ▲プロジェクト名\Debug ▲プロジェクト名\Release △プロジェクト名\プロジェクト名\Debug △プロジェクト名\プロジェクト名\Release ▲と△の違いとは何なのでしょうか。 log4cpp等のDLLを配置するのにどこに配置するのが正しいのかの確認です。 ▲にはDebugやRelease時の実行ファイルがあるので、同じ箇所へ DLLを配置するのかなと思ったのですが、Debugする際に、△の方に 配置する必要があるように見えたための質問です。
回答: こんにちは。 お手軽に下記コードでやってみました。この実験のためにはlog4cppのシミュレートはこれで十分な筈です。 (msvc 2015でトライしましたが、たぶん2013でも同じでしょう。) ``` #include "stdafx.h" namespace log4cpp { struct Category { static Category& getRoot() { Category instance; return instance; } void warn(const std::string &str) { std::cout << "warn(" << str << ")\n"; } }; struct PropertyConfigurator { static void configure(const std::string &str) { std::cout << "configure(" << str << ")\n"; } }; } class Log { private: Log(); public: ~Log(); static log4cpp::Category& getLogger(); }; Log::Log() { } Log::~Log() { } log4cpp::Category& Log::getLogger() { const std::string propatiesFileName = "log4cpp.properties"; log4cpp::PropertyConfigurator::configure(propatiesFileName); return log4cpp::Category::getRoot(); } int _tmain(int argc, _TCHAR* argv[]) { log4cpp::Category& logger = Log::getLogger(); logger.warn("Storm is coming"); return 0; } ``` > > "入ってきていない"というのは、Debugの際には文字列 > > 「log4cpp.properties」がきちんと渡ってきていますが、 > > Releaseの場合には、「<文字列の文字の読み取り中にエラーが発生しました。>」 > > となっています。 > > > これはたまたまのようです。デバッガで見るとstd::stringに_Bufと_Ptrがあり、_Bufにはでたらめな文字列が、_Ptrには"log4cpp.properties"が入っています。_Bufに文字列として表示できないコードがたまたま入っていた時に「<文字列の文字の読み取り中にエラーが発生しました。>」 と表示されるのだろうと思います。 > > ■質問内容1 > > > 上記実験より、恐らく原因は別にあると思います。 > > ■質問内容2 > > > 上記のように「たまたま」だろうと思います。 > > ■質問内容3 > > ▲と△の違いとは何なのでしょうか。 > > > ▲は恐らく正しくは、プロジェクト名ではなくソリューション名です。 1つのソリューションには複数のプロジェクトがありますから、それら全ての最終成果物が▲に入るようです。 △には各プロジェクトの中間生成物(objファイルなどなど)が入ようです。