用g++编译最简单的C++程序hello.C出现可以用-Wno-deprecated屏蔽的警告,想问个究竟

本文探讨了在C++中使用<iostream.h>导致的编译警告问题及解决方案,涉及新旧标准的差异、命名空间std的使用以及如何避免警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序如下:   
  #include   <iostream.h>   
    
  main   ()   
  {   
          cout   <<   "hello,   world!"   <<   endl;   
  }   
    
    
  警告如下:   
  in   file   included   from   /usr/include/c++/3.2.2/backward/iostream.h:31,   
                                    from   hello.c:1:   
  /usr/include/c++/3.2.2/backward/backward_warning.h:32:2:   warning:     
  #warning   this   file   includes   at   least   one   deprecated   or   antiquated   header.     
  please   consider   using   one   of   the   32   headers   found   in   section   17.4.1.2   of   the   c++   standard.   
  examples   include   substituting   the   <x>   header   for   the   <x.h>   header   for   c++   includes,   or   <sstream>   instead   of     
  the   deprecated   header   <strstream.h>.   to   disable   this   warning   use   -wno-deprecated.   
    
  出现上面的警告是什么原因,要怎么解决才可以不用-wno-deprecated参数直接编译。   
 

网友:blh

c++的程序和c时有区别的,修改如下   
  #include   <iostream>   
  using   namespace   std;   
    
  main   ()   
  {   
          cout   <<   "hello,   world!"   <<   endl;   
  }   

网友:ybei

<iostream.h>是老的c++函数库,g++建议你使用新的<iostream>   
  使用方法就像楼上说的   
  要注意using   namespace   std   不能省

 

网友:interbanker

#include   <iostream.h>   
    
  main   ()   
  {   
          cout   <<   "hello,   world!"   <<   endl;   
  }   
  ------------------------------------   
  当使用gcc编译的时候提示出错:   
  gcc   hello.cpp   -o   hello   
  undefined                                               first   referenced   
    symbol                                                           in   file   
  endl(ostream   &)                                           /usr/tmp/cckxbuns.o   
  ostream::operator<<(ostream   &(*)(ostream   &))/usr/tmp/cckxbuns.o   
  cout                                                                 /usr/tmp/cckxbuns.o   
  ostream::operator<<(char   const   *)       /usr/tmp/cckxbuns.o   
  hello:   fatal   error:   symbol   referencing   errors.   no   output   written   to   hello   
  collect2:   ld   returned   1   exit   status   
    
  当使用g++编译   
  g++   hello.cpp   -o   hello   
  编译通过,   
  我把hello.cpp改成hello.c,还是用g++   hello.c   -o   hello,编译通过   
  综上所述,编译不通过的原因不是因为命名空间的问题。   
  因为gcc编译的是c语言,g++编译的是c++程序。   
    
    
  另注:         
    gcc         assumes   preprocessed   (.i)   files   are   c   and   assumes   c   
                              style   linking.   
    
    g++         assumes   preprocessed   (.i)   files   are   c++   and   assumes   
                              c++   style   linking.   
    
    
 

网友:onlymilan

#include   <iostream.h>   是window下的   
    
  #include   <iostream>   
  using   namespace   std;     这才是unix/linux下的

网友:fierygnu

呵呵。   
  老c++用.h做头文件,没有namespace   std,新标准规定不要.h,有namespace。这个跟平台没关系,跟编译器实现遵循的标准有关系。

网友:onlymilan

命名空间是新的c++标准中的,新版本的c++编译器支持命名空间,unix/linux下的g++都支持   
  所以,在unix/linux下这样写   
    
  #include   <iostream>   
  using   namespace   std;   
    
  绝对不会有警告。   
    
  而在windows   vc++   下这样写   
    
  #include   <iostream>   
  using   namespace   std;   
    
  就会出错。如果使用#include   <iostream.h>就没问题。   
  而在unix/linux下使用#include   <iostream.h>就会出警告,因为这是老版本的c++标准 

<think>好的,我现在要解决用户遇到的编译错误问题。首先,用户提供的错误信息显示在配置OpenFST时出现了问题,特别是在检查C++测试程序时失败,提示需要添加-msse和-mfpmath=sse选项。我需要逐步分析可能的原因和解决方案。 首先,看错误信息中的关键点:configure阶段在检查g++的PIC标志和静态标志时失败,最后提示测试浮点相等性失败,建议使用g++时加上-msse和-mfpmath=sse选项。这说明编译器在测试某些代码时无法通过,可能是因为SSE指令集的支持问题。 接下来,我需要考虑可能的解决方案。根据经验,这类问题通常与编译器选项有关。首先应该检查是否缺少必要的编译标志,比如用户提到的-msse和-mfpmath=sse。这些选项用于启用SSE指令集和设置浮点运算单元,可能在某些架构或旧版编译器中默认未启用。 然后,考虑到用户可能在较旧的CPU或特定环境下编译,可能需要手动添加这些选项。用户需要修改configure步骤中的CXXFLAGS,或者在运行configure时传递这些参数。此外,检查config.log文件中的具体错误信息也很重要,可以更准确地定位问题所在。 另外,用户使用的编译器版本可能也是一个因素。如果g++版本过旧,可能不支持某些C++17特性或需要的编译选项。建议用户确认g++版本是否符合OpenFST的要求,并考虑升级编译器或安装必要的依赖库。 还有,检查系统是否安装了正确的开发工具链,比如build-essential、libtool、automake等,这些在编译过程中是必须的。缺少这些工具可能导致配置脚本无法正确生成所需的Makefile。 最后,如果上述步骤无效,可能需要手动编辑configure文件或相关的libtool脚本,强制添加所需的编译选项。不过,这需要谨慎操作,避免引入其他问题。 总结可能的解决步骤:添加编译选项、检查编译器版本、安装依赖工具、查看config.log详细信息,并在必要时手动调整配置脚本。需要将这些步骤以清晰的方式呈现给用户,帮助他们逐步排查和解决问题。</think>这个错误是在编译OpenFST时出现的配置问题,以下是分步排查和解决方案: --- ### **1. 核心错误定位** ```bash configure: error: Test float equality failed! Compile with -msse -mfpmath=sse if using g++ ``` 说明编译器在测试浮点运算时失败,要求添加SSE指令集支持。 --- ### **2. 直接解决方法** #### **(1) 添加SSE编译参数** 在运行`configure`时显式添加SSE相关参数: ```bash CXXFLAGS="-msse -mfpmath=sse" ./configure --enable-static --enable-shared --enable-far --enable-ngram-fsts ``` 或通过环境变量传递: ```bash export CXXFLAGS="-msse -mfpmath=sse" ./configure [其他参数] ``` #### **(2) 检查CPU架构** * 如果CPU不支持SSE(较老的硬件),需要修改OpenFST代码: 在`src/include/fst/float-weight.h`中注释掉相关断言: ```cpp // 查找类似以下代码并注释: // if (fabs(l - r) > 0.0001) FSTERROR() << "FloatWeightTpl::Plus:..." ``` --- ### **3. 排查其他潜在问题** #### **(1) 检查g++版本** 确保g++支持C++17: ```bash g++ --version # 需要 >= 7.0 ``` 若不满足,升级g++: ```bash sudo apt install g++-11 # Ubuntu示例,选择合适版本 ``` #### **(2) 检查依赖工具链** 安装编译必需工具: ```bash sudo apt install build-essential libtool automake autoconf ``` #### **(3) 查看config.log** 根据错误提示查看日志: ```bash cat /home/aaeon/Desktop/kaldi/tools/openfst-1.8.0/config.log | grep -i error ``` --- ### **4. 完整编译流程示例** ```bash cd /home/aaeon/Desktop/kaldi/tools wget http://www.openfst.org/twiki/pub/FST/FstDownload/openfst-1.8.0.tar.gz tar -zxvf openfst-1.8.0.tar.gz cd openfst-1.8.0 CXXFLAGS="-msse -mfpmath=sse" ./configure --enable-static --enable-shared --enable-far --enable-ngram-fsts make -j$(nproc) sudo make install ``` --- ### **5. 常见陷阱** - **32位系统问题**:OpenFST要求64位环境,检查系统架构: ```bash uname -m # 应为x86_64 ``` - **权限问题**:确保对编译目录有写入权限(必要时用`chmod`)。 - **Kaldi兼容性**:如果仍失败,尝试切换OpenFST版本(如1.7.7)。 --- ### **6. 验证安装** 成功编译后检查库文件: ```bash ls -l /usr/local/lib/libfst.* # 应存在.so和.a文件 ``` 如果问题依旧,请提供`config.log`中具体的错误段落以进一步分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值