我们有一个相当大的 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);
. ::strdup
如果我在VS上按 F12,我会string.h
进入 C 标准库的声明。
如果我删除它构建的命名空间限定符,尽管 IntelliSense 告诉我它现在是一个递归调用,所以它可能无法工作。如果我将命名空间更改为std::
我会收到大约 270个错误,这一次来自其他几个项目。如果我将功能更改为::_strdup
它构建。包括string.h
作为第一件事没有改变。
(注意事项:“它构建”是指“这个特定的编译器错误在那个位置消失了,但显然它仍然留下关于其他函数的错误。)
我在这里有点不知所措。我注意到许多大型库要么在标准库上构建自己的抽象,要么提供默认情况下不存在的东西,这就是 ACE 和 ImageMagick 已经发生冲突的地方(在两者中,但typedef
定义ssize_t
不兼容)。由于我们引入了很多库(我现在也没有确切的概述),这很可能是另一个冲突,由错误的包含顺序和类似的事情引起。来自 ACE 的相同包含在同一解决方案中的其他项目中显然可以正常工作,这一事实也暗示了这一点。
任何人都知道我至少可以在这里寻找什么?构建日志/showIncludes
只有 24k 行,所以我在那里看不到很多模式,除了string.h
在有问题的 ACE 标头之前包含的模式。
而且我不想修改库源代码,因为如果我们更新到新版本,那只会再次咬我们。