当前位置 : 主页 > 大数据 > 区块链 >

cc1plus:warning:命令行选项“-Wstrict-prototypes”对Ada / C / ObjC有效,但不适用于C

来源:互联网 收集:自由互联 发布时间:2021-06-22
我正在构建一个用于Python的C扩展.我看到在编译过程中生成的这个警告 – 当一个类型: python setup.py build_ext -i 是什么原因造成的,我该如何解决? BTW,这里是我的安装文件的副本: #!/u
我正在构建一个用于Python的C扩展.我看到在编译过程中生成的这个警告 – 当一个类型:

python setup.py build_ext -i

是什么原因造成的,我该如何解决?

BTW,这里是我的安装文件的副本:

#!/usr/bin/env python

    """
    setup.py file for SWIG example
    """

    from distutils.core import setup, Extension


    example_module = Extension('_foolib',
                               sources=['example_wrap.cxx', 
                                        '../wrapper++/src/Foo.cpp'
                                       ],
                               libraries=["foopp"]
                               )

    setup (name = 'foolib',
           version = '0.1',
           author      = "Me, Myself and I",
           description = """Example""",
           ext_modules = [example_module],
           py_modules = ["example"],
           )

我在Ubuntu上使用gcc 4.4.3

我可以回答问题的一部分,为什么你得到的消息.

您的构建过程中的某些东西正在使用-Wstrict-prototypes选项在C源文件中调用gcc.对于C和Objective-C,这会导致编译器对不声明参数类型的旧式函数声明发出警告.

对于C,这个选项没有意义;这种声明甚至不被语言所允许(原型是强制性的).

(我不知道为什么这个消息提到了Ada; -Wstrict-prototypes对于Ada而言比对C更不了解,这并不是一件很大的事情,但是我提交了this bug report,截至2015-12年为止,已被标记为RESOLVED / FIXED 06.)

解决方案应该是从gcc的调用中删除-Wstrict-prototypes选项.但是由于您没有直接调用gcc,所以很难知道如何做到这一点.

在手动创建一个虚拟的example_wrap.cxx文件后,我可以使用setup.py重现警告:

% python setup.py build_ext -i
running build_ext
building '_foolib' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c example_wrap.cxx -o build/temp.linux-i686-2.7/example_wrap.o
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
...

所以这可能是Python的build_ext中的一个小错误.

但由于这只是一个警告,而不是一个致命的错误,我会说你可以安全地忽略它. gcc警告关于无意义的选项,但是它只是忽略它.

编辑:

看看Python-2.7.2源码,configure.in的这一节可能是罪魁祸首:

case $GCC in
yes)
    if test "$CC" != 'g++' ; then
        STRICT_PROTO="-Wstrict-prototypes"
    fi

(我假设在使用build_ext时被调用.)

它仅在编译器未被调用为g时才启用-Wstrict-prototypes选项,但在您的情况下,它使用gcc命令来编译C源代码.而在Lib / distutils / command / build_ext.py中,只有在调用self.compiler.link_shared_object()时,build_extension()才会调用self.compiler.compile()时不注意源文件语言. (这似乎是奇怪的;除了gcc之外的编译器,你不一定能够使用相同的命令来编译C和C – 即使你没有链接,使用g命令也是有意义的. )

更新:提交了一个Python错误报告:https://bugs.python.org/issue9031,并作为这个复制的一个关闭:https://bugs.python.org/issue1222585,这仍然是我写的.

但正如我所说,这只是一个警告,你可以安全地忽略它.也许Python维护者可以使用上述信息来在以后的版本中解决问题.

网友评论