Linux (gcc) と Windows (Visual Studio) の両方でライブラリをコンパイルしてきましたが、予想どおり、両方のプラットフォームでクリーンなコンパイルを取得するために必要なものに、わずかではあるが大きな違いは見られませんでした。
今日、gcc コンパイラ フラグを使用するように変更しまし-fPIC
た (共有ライブラリを作成できるようにするため)。ライブラリに対してプログラムをリンクするテストを行ったところ、ヘッダー ファイルで宣言および初期化された 2 つの静的定数で (初めて) エラーが発生し始めました undefined reference
(.cpp ファイルではありません)。
問題に対処しているように見えるこのStackOverflowの回答を見つけましstatic const
た.ヘッダーファイルで初期化されていても、コードファイルで定義する必要があることを説明しています。そして、その変更を行うと、gcc リンカー エラーが削除されました。
しかし、Visual Studio はその変更を気に入らず、multiple definition
エラーを生成しました。Visual Studio を正常にコンパイルするには、プリプロセッサの条件を必要とする定義をラップする必要がありました。
ここでの違いについて誰かが教えてくれますか? (コードの抜粋は以下です。)
msg.h
class msg
{
public:
static const int EMPTY_INT_VALUE = INT_MAX;
static const char EMPTY_STRING_VALUE = '\002';
// can't define value in header, defined in cpp file
static const double EMPTY_DOUBLE_VALUE;
...
}
msg.cpp
#include "msg.h"
const double msg::EMPTY_DOUBLE_VALUE(DBL_MAX);
#ifndef _WIN32
// g++ requires these definitions, vs 2010 doesn't like them
const int msg::EMPTY_INT_VALUE;
const char msg::EMPTY_STRING_VALUE;
#endif