当前位置: 首页 > 面试题库 >

cc1plus:警告:命令行选项“ -Wstrict-prototypes”对Ada / C / ObjC有效,但对C ++无效

后树
2023-03-14
问题内容

我正在构建用于Python的C ++扩展。我看到在编译过程中生成此警告-类型为:

python setup.py build_ext -i

是什么原因引起的,如何解决?

顺便说一句,这是我的安装文件的副本:

#!/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


问题答案:

我可以回答部分问题,为什么会收到消息。

在构建过程中,有些事情是使用选项调用C ++源文件上的gcc -Wstrict- prototypes。对于C和Objective-C,这会使编译器警告未声明参数类型的旧式函数声明。

对于C ++,此选项没有任何意义。这种语言甚至都不允许这样的声明(原型是强制性的)。

(我不知道为什么消息中提到Ada;-Wstrict-prototypes对Ada而言,其含义甚至比对C
++而言没有多大意义。但这并不是什么大问题,但我已提交了此错误报告,从2015年12月6日起标记为已解决/已修复。


解决方案应该是-Wstrict-prototypes从gcc调用中删除该选项。但是由于您不是直接调用gcc,所以很难知道该怎么做。

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

% 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。)

-Wstrict-prototypes仅当 g++-方式调用编译器时,它才会打开该选项,但在您的情况下,它将使用gcc命令来编译C
源代码。而且 Lib/distutils/command/build_ext.pybuild_extension()在调用 self.compiler.compile()时,不必仅仅注意源文件的语言 self.compiler.link_shared_object()。(这似乎很奇怪;对于gcc以外的编译器,您不一定能够使用相同的命令来编译C和C
g++即使不进行链接,无论如何仍要使用该命令。)

更新:提交了一个Python错误报告:https :
//bugs.python.org/issue9031,并作为以下内容的副本进行了关闭:https
:
//bugs.python.org/issue1222585,在我撰写本文时仍处于打开状态。

但是正如我所说,这只是一个警告,您可以放心地忽略它。也许Python维护人员可以使用以上信息在将来的版本中解决该问题。



 类似资料:
  • 我成功地在我的java/maven eclipse项目上运行cucumber测试。但是,当我添加我的项目做Jenkins我总是得到以下错误"cucumber.runtime.CucumberExc0019:没有发现的功能在[]"。 我在命令行中阅读了Maven中的以下线程设置选项: ...测试在单独的JVM中运行,因此您需要在测试插件配置中指定该系统属性(即pom.xml中的surefire或fa

  • Node.js 自带了各种命令行选项。 这些选项开放了内置的调试、执行脚本的多种方式、以及其他有用的运行时选项。运行 man node 可在一个终端中查看操作手册。 概要 node [options] [v8 options] [script.js | -e "script" | -] [--] [arguments] node debug [script.js | -e "script" | <

  • Shebang 行 几乎每个 Perl 程序都如此开始: #!/usr/bin/perl 这是 UNIX 结构,它告诉 Shell 直接执行余下的输入程序文件。 你可以在此行添加 Perl 的任何命令行选项,它们将成为选项之后命令行的一部分。 如果你有一个程序包含: #!/usr/bin/perl -T 然后执行: perl -l program.pl -l 和 -T 两个选项都会使用,但

  • 我看到以下运行时编程选项:https://help.eclipse.org/2018-12/index.jsp?topic=%2forg.eclipse.jdt.doc.user%2ftask%2ftask-using_batch_compiler.htm 例如,我看到: 只看错误,不看警告。

  • Ruby 一般是从命令行运行,方式如下: 解释器可以通过下列选项被调用,来控制解释器的环境和行为。 选项 描述 -a 与 -n 或 -p 一起使用时,可以打开自动拆分模式(auto split mode)。请查看 -n 和 -p 选项。 -c 只检查语法,不执行程序。 -C dir 在执行前改变目录(等价于 -X)。 -d 启用调试模式(等价于 -debug)。 -F pat 指定 pat 作为默

  • Envoy由JSON配置文件以及一组命令行选项驱动。以下是Envoy支持的命令行选项。 -c \, --config-path \ (必选)指向v1或v2 JSON/YAML/proto3配置文件)的路径。若设置-v2-config-only选项,则将被解析为一个v2引导配置文件,如果是v1 JSON配置文件,则返回失败。对于v2配置文件,有效的扩展名是.json,.yaml,.pb和.pb_te

  • 问题内容: 我想制作一个用C ++编写的服务器来支持我的游戏。我学习了套接字的基础知识,并编写了一个运行良好的基本聊天程序。现在,我想创建一个像Apache这样的HTTP服务器,但是仅用于AJAX请求- 响应部分。 我认为刚开始时,我复制了一个Apache响应文本,并使用C ++服务器程序发送了准确的响应。 问题是浏览器(Firefox)连接到apache,并且一切正常,除了所有请求均得到正确的响

  • 主要内容:以下是纠正/补充内容:执行时,可以将一些值从命令行传递给Objective-C程序。 这些值称为命令行参数,很多时候它们对程序很重要,特别是当想要从外部控制程序而不是在代码中对这些值进行硬编码时就很有用了。 命令行参数使用函数参数处理,其中表示传递的参数数量,是指针数组,指向传递给程序的每个参数。 以下是一个简单的示例,它检查命令行是否提供了任何参数并采取相应的操作 - 当使用单个参数编译和执行上述代码时,例如使用命令