【问题标题】:Can't compile C++ project (macro "max" passed 3 arguments, but takes just 2)无法编译 C++ 项目(宏“max”传递了 3 个参数,但只需要 2 个)
【发布时间】:2011-07-06 13:14:35
【问题描述】:

对于通用标题,我很抱歉,但在 C++ 编译方面我不是专业人士,我似乎无法在这里找到错误。

我正在检查一个官方项目,所以我知道它实际上应该编译得很好。它没有。

如果有人想自己签出代码,你可以这样做:

cvs -d :pserver:jvtuser:jvt.Amd.2@garcon.ient.rwth-aachen.de:/cvs/jvt login
cvs -d :pserver:jvtuser@garcon.ient.rwth-aachen.de:/cvs/jvt checkout jmvc
cd jmvc/JMVC/H264Extension/build/linux
make

当我拨打make 时,我收到:

make -C lib/H264AVCVideoIoLib release
make[1]: Entering directory `/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib'
g++ -c -MMD -MF ./objects/H264AVCVideoIoLib.r.d -MT ./objects/H264AVCVideoIoLib.r.o -fPIC -DMSYS_LINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -DMSYS_UNIX_LARGEFILE  -I/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include -I../../../../src/lib/H264AVCVideoIoLib -DMERL_VIEW -Wall -Wshadow -Wno-reorder -Wno-sign-compare -O3 -ffloat-store -DNDEBUG -Wuninitialized -o objects/H264AVCVideoIoLib.r.o /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../src/lib/H264AVCVideoIoLib/H264AVCVideoIoLib.cpp
In file included from /usr/include/c++/4.4/bits/stl_algo.h:61,
                 from /usr/include/c++/4.4/algorithm:62,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCCommonIf.h:56,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCVideoIoLib.h:5,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../src/lib/H264AVCVideoIoLib/H264AVCVideoIoLib.cpp:2:
/usr/include/c++/4.4/bits/algorithmfwd.h:353: error: macro "max" passed 3 arguments, but takes just 2
/usr/include/c++/4.4/bits/algorithmfwd.h:364: error: macro "min" passed 3 arguments, but takes just 2
In file included from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemCont.h:9,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h:9,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCCommonIf.h:45,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCVideoIoLib.h:5,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../src/lib/H264AVCVideoIoLib/H264AVCVideoIoLib.cpp:2:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemAccessor.h: In member function ‘Void MemAccessList<T>::copyPayload(T*&, UInt&)’:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemAccessor.h:207: error: ‘::memcpy’ has not been declared
In file included from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h:9,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCCommonIf.h:45,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCVideoIoLib.h:5,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../src/lib/H264AVCVideoIoLib/H264AVCVideoIoLib.cpp:2:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemCont.h: In copy constructor ‘MemCont<T>::MemCont(const MemCont<T>&)’:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemCont.h:68: error: ‘::memcpy’ has not been declared
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemCont.h: In member function ‘MemCont<T>& MemCont<T>::operator=(const MemCont<T>&)’:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemCont.h:113: error: ‘::memcpy’ has not been declared
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemCont.h: In member function ‘Void MemCont<T>::release(T*&, UInt&)’:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemCont.h:221: error: ‘::memcpy’ has not been declared
In file included from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCCommonIf.h:45,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCVideoIoLib.h:5,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../src/lib/H264AVCVideoIoLib/H264AVCVideoIoLib.cpp:2:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h: In copy constructor ‘MemList<T>::MemList(const MemList<T>&)’:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h:31: error: ‘::memcpy’ has not been declared
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h: In member function ‘MemList<T>& MemList<T>::operator=(const MemList<T>&)’:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h:68: error: ‘::memcpy’ has not been declared
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h: In member function ‘Void MemList<T>::release(T*&, UInt&)’:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h:129: error: ‘::memcpy’ has not been declared
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h:151: error: ‘::memcpy’ has not been declared
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h: In member function ‘Void MemList<T>::release(T*&, UInt&, T*&, UInt&)’:
/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/MemList.h:181: error: ‘::memcpy’ has not been declared
In file included from /usr/include/c++/4.4/bits/stl_algo.h:61,
                 from /usr/include/c++/4.4/algorithm:62,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCCommonIf.h:56,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCVideoIoLib.h:5,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../src/lib/H264AVCVideoIoLib/H264AVCVideoIoLib.cpp:2:
/usr/include/c++/4.4/bits/algorithmfwd.h: At global scope:
/usr/include/c++/4.4/bits/algorithmfwd.h:349: error: expected unqualified-id before ‘const’
/usr/include/c++/4.4/bits/algorithmfwd.h:349: error: expected ‘)’ before ‘const’
/usr/include/c++/4.4/bits/algorithmfwd.h:349: error: expected ‘)’ before ‘const’
/usr/include/c++/4.4/bits/algorithmfwd.h:349: error: expected initializer before ‘const’
/usr/include/c++/4.4/bits/algorithmfwd.h:353: error: template declaration of ‘const _Tp& std::max’
/usr/include/c++/4.4/bits/algorithmfwd.h:360: error: expected unqualified-id before ‘const’
/usr/include/c++/4.4/bits/algorithmfwd.h:360: error: expected ‘)’ before ‘const’
/usr/include/c++/4.4/bits/algorithmfwd.h:360: error: expected ‘)’ before ‘const’
/usr/include/c++/4.4/bits/algorithmfwd.h:360: error: expected initializer before ‘const’
/usr/include/c++/4.4/bits/algorithmfwd.h:364: error: template declaration of ‘const _Tp& std::min’
In file included from /usr/include/c++/4.4/algorithm:62,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCCommonIf.h:56,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../include/H264AVCVideoIoLib.h:5,
                 from /home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib/../../../../src/lib/H264AVCVideoIoLib/H264AVCVideoIoLib.cpp:2:
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘void std::__merge_sort_loop(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _Distance)’:
/usr/include/c++/4.4/bits/stl_algo.h:3239: error: expected unqualified-id before ‘(’ token
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘void std::__merge_sort_loop(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _Distance, _Compare)’:
/usr/include/c++/4.4/bits/stl_algo.h:3263: error: expected unqualified-id before ‘(’ token
make[1]: *** [objects/H264AVCVideoIoLib.r.o] Error 1
make[1]: Leaving directory `/home/user/JMVC/jmvc/JMVC/H264Extension/build/linux/lib/H264AVCVideoIoLib'
make: *** [release] Error 2

仅供参考,我使用的是 g++:

Using built-in specs.
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

... 和 gcc:

Using built-in specs.
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 

如果有人指点我将非常感激......

【问题讨论】:

  • 您的最小和最大宏已损坏。请发布它们,我们可以让您知道出了什么问题。
  • 这里相同 - 您是否已经找到任何解决方法或修复?还是您在存储库中遇到了工作版本?
  • 不,问题似乎与此 JM 代码非常具体。也许他们在两者之间修复了它,但我宁愿写开发人员。我还没有尝试过,但是自从我写了这个问题以来,已经发布了一些更新的版本。 @vls

标签: compiler-construction g++ makefile compiler-errors


【解决方案1】:

C++ 的标准库不使用或定义 maxmin 作为宏。报告第一个错误的行 (/usr/include/c++/4.4/bits/algorithmfwd.h:353) 包含带有第三个参数的 std::max 模板函数的前向声明。从我在您提供的信息中可以看到,我认为您的系统上包含了一些旧标题,它将max()min() 定义为宏。顺便说一下,这是一个常见问题。

您需要识别定义max/min 的标头(或源文件),并尝试确定是否有一种方法可以配置源代码以在没有该标头的情况下构建。

更新: 看起来罪魁祸首在源文件中:

> grep -R "#define min" *
include/DownConvertTools.inl:#define min(x, y) ((x)<(y)?(x):(y))
include/H264AVCCommonLib/GlobalFunctions.h:#define min(x,y) ((x)<(y)?(x):(y))
include/H264AVCCommonIf.h:#define min(x,y) ((x)<(y)?(x):(y))
src/test/H264AVCDecoderLibTest/DecoderParameter.h:#define min(x,y) (((x) < (y)) ? (x) : (y))
src/lib/H264AVCCommonLib/CFMO.cpp://#define min(a,b) ((a)>(b))?b:a

重复的定义通常意味着代码无论如何都需要清理,因此您可以先删除宏并将max/min 替换为std::max/std::min

【讨论】:

  • 看起来很有希望,我会研究一下。但是,我不想摆弄不是我自己的代码。存储库维护者是否可能不知道这个问题?
  • 还有更多问题。 memcpy 和 sprintf 缺少正确的包含。有时,特定系统的构建会中断,因为该系统没有优先级(而且通常有足够多的开发人员根本不知道如何编写在比他们自己的平台更多的代码下编译的代码)。构建代码似乎可以在 Windows 上运行(除了我的机器上缺少一些 ddraw.lib),所以我猜最后几次签入根本没有针对 linux 进行测试。您可以询问所有者这是否是一个已知问题,以及他们是否会从您那里获取修复它的补丁。
  • 嗯,我有一个可以尝试编译的 Windows 工作站。也许我也可以恢复到更稳定的分支。所以基本上,你的意思是我可能需要更长的时间来修复当前状态而不是找到一个有效的状态?
【解决方案2】:

ddraw.lib 实际上并没有被软件使用,因此您可以安全地从链接器使用的库列表中删除 ddraw.lib,解决方案将成功构建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多