かなり大きなC++プロジェクトがあり、現在VS2010に移行し、途中でいくつかのライブラリを更新しています。これまでのところ、すべてが正常に構築されていますが、(私にとっては)非常に奇妙なエラーが発生し、明らかにいくつかの(編集:非)標準のC関数とシンボルが定義されていません。
error C2039: 'strdup' : is not a member of '`global namespace'' ...\ACE_wrappers\ace\OS_NS_string.inl 222
...
error C2065: 'O_WRONLY' : undeclared identifier ...\ACE_wrappers\ace\OS_NS_unistd.inl 1057
...
これは、次の関数と記号に影響します。
strdup getcwd O_WRONLY
putenv swab O_TRUNC
access unlink S_IFDIR
chdir mkdir S_IFREG
rmdir tempnam O_RDONLY
isascii
私が実験したACEのインクルードファイルの一部は、strdup
次のような部分でした。
ACE_INLINE char *
ACE_OS::strdup (const char *s)
{
# if (defined (ACE_LACKS_STRDUP) && !defined(ACE_STRDUP_EQUIVALENT)) \
|| defined (ACE_HAS_STRDUP_EMULATION)
return ACE_OS::strdup_emulation (s);
# elif defined (ACE_STRDUP_EQUIVALENT)
return ACE_STRDUP_EQUIVALENT (s);
# elif defined (ACE_HAS_NONCONST_STRDUP)
return ::strdup (const_cast<char *> (s));
#else
return ::strdup (s);
# endif /* (ACE_LACKS_STRDUP && !ACE_STRDUP_EQUIVALENT) || ... */
}
上と下の他の関数にも同様のセクションがたくさんあり、それらはすべて正常にコンパイルされます。
私の場合のパスは最後のパスreturn ::strdup (s);
です。VSでF12を押すと、C標準ライブラリ::strdup
の宣言に移動します。string.h
ビルドした名前空間修飾子を削除すると、IntelliSenseは再帰呼び出しであると言っているので、おそらく機能しません。名前空間を変更すると、他のいくつかのプロジェクトから、さらにstd::
約270のエラーが発生します。関数を変更するとビルドされます。非常に最初のものを含めると何も変わりません。::_strdup
string.h
(注意:「ビルドする」とは、「この特定のコンパイラエラーはその場所で消えますが、他の関数に関するエラーは明らかに残ります。)」を指します。
私はここで少し途方に暮れています。多くの大規模なライブラリは、標準ライブラリに対して独自の抽象化を構築するか、デフォルトでは存在しないものを提供することに気付きました。これは、ACEとImageMagickがすでに衝突しているポイントでした(両方ともtypedef
互換ssize_t
性のない定義で)。かなりの数のライブラリを取得しているので(現時点では正確な概要もわかりません)、これは別の衝突である可能性があります。これは、インクルードの順序が間違っているなどの理由で発生します。これは、ACEからの同じインクルードが同じソリューションの他のプロジェクトで明らかに正常に機能するという事実によっても示唆されています。
誰かが私が少なくともここで何を探すことができるかについての考えを持っていますか?ビルドログはわずか24k行であるため、問題のあるACEヘッダーの前に含まれる/showIncludes
ことを除いて、多くのパターンは正確には表示されません。string.h
また、ライブラリのソースコードを変更したくないのは、新しいバージョンに更新した場合にのみ、ライブラリのソースコードが再び噛み付くからです。