问题标签 [g++]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
475 浏览

templates - g ++中的模板函子错误

我有一些代码,我想使用地图中的映射值构建元素向量。下面的代码在 Visual Studio 中运行良好(据我所知似乎是合法的),但 g++ 不同意。

不幸的是,我现在没有确切的错误文本(关于无法弄清楚要使用哪个重载函数)或 g++ 的特定版本(最新版本与 Ubuntu 一起分发),但我会当我得到它时更新这篇文章。

同时,谁能解释为什么 g++ 不能解析所提供的函子的类型?

0 投票
3 回答
7329 浏览

c++ - 如何阻止 g++ 链接不需要的异常处理代码?

我正在使用为 arm-eabi 编译的 GCC/G++ 开发嵌入式应用程序。由于资源限制,我试图禁用标准 C++ 异常处理。我正在使用“-fno-exceptions -nostartfiles -ffreestanding”编译代码。

当一个类的全局实例存在,并且该类包含另一个类的实例作为成员时,就会链接到很多异常处理代码。这不会那么糟糕,除了它也带来了很多stdio 的东西,比如 printf、fopen、fclose 和其他 FILE 函数。这个应用程序没有文件系统,即使有,这些函数也会浪费太多的代码空间。

我知道即使使用 -fno-exceptions,G++ 也会在使用异常的运算符 new 中链接,因为该库没有使用非异常的运算符 new(new(nothrow) 除外)。我为 operator new 和 delete 创建了替换,它们链接到输出以及不需要的标准库函数。

令我困惑的是,我没有在任何地方调用 new。只有当一个全局对象包含另一个对象时,所有这些代码才会链接到其中。

例如:

如果创建了 UartA 的全局实例,则不会链接异常处理、operator new 和 stdio 内容。这就是我想要的。

如果创建了 UartB 的全局实例(其中 rxbuf 是实例而不是指针),则会链接不需要的代码。

UartA 和 UartB 都不使用 operator new、exceptions 或 stdio。它们的区别仅在于 rxbuf 的类型。

你能建议如何防止链接额外的代码吗?另外,为什么这与 UartB 相关联,而不是 UartA?

0 投票
1 回答
2290 浏览

c++ - Linux 上来自共享对象 (.so) 的异常

我有一个名为 ftest 的测试程序。它加载包含测试的 .so 文件并运行它在其中找到的测试。其中一个测试加载并运行一个 .so,其中包含用于我们的 O/RM 的 Postgres 数据库驱动程序。

当 Postgres 驱动程序抛出在该 .so 文件中定义的异常(或它链接到但 ftest 未链接到的文件)并被测试框架捕获时,异常析构函数会触发段错误。

只要编译的异常位于已动态加载(使用 dload)的 .so 中,就会发生此段错误。

这种事情在具有相同架构的 Windows 中运行良好。我们真的不想限制自己只使用来自核心库的异常——插件应该可以自由地创建自己的异常类并正常处理它们。

异常是 std::exception 的子类。有时异常可能在库中定义(例如 libpqxx),这意味着异常有时也超出了我们的控制范围。

使用以下内容引发异常:

并被使用:

是否需要一些特殊的编译器选项才能使其正常工作?我们是否需要通过切换来抛出异常throw new exception_class( args )(我们真的不想这样做)?

0 投票
10 回答
43795 浏览

c++ - 如何检测类中是否存在特定的成员变量?

为了创建算法模板函数,我需要知道作为模板参数的类中的 x 或 X(以及 y 或 Y)。在将我的函数用于 MFC CPoint 类或 GDI+ PointF 类或其他一些类时,它可能很有用。他们都在其中使用不同的 x。我的解决方案可以简化为以下代码:

但它不能在 Visual Studio 中编译,而在 GNU C++ 中编译。使用 Visual Studio,我可以使用以下模板:

但它不能在 GNU C++ 中编译。有通用的解决方案吗?

UPD:此处的结构 P1 和 P2 仅作为示例。可能有任何具有未知成员的类。

PS 请不要在此处发布 C++11 解决方案,因为它们很明显且与问题无关。

0 投票
1 回答
1361 浏览

gcc - GNU C++ 错误消息

在线提供 g++ 编译器的错误/警告消息的完整列表吗?

我正在寻找类似于 MSDN 文档的内容,该文档描述了每条消息的含义,并且可能有一些示例代码来演示导致此类错误的条件。

我查看了GCC 在线文档,但我什至没有看到所有可能消息的简单枚举。

0 投票
3 回答
2612 浏览

visual-c++ - 用于 GCC/G++ 的 VC++ #import 指令

我正在尝试测试一个提供 VC++ 示例的库;但是,我对所有项目都使用 gcc/g++。

好吧,VC++ 示例访问库的方式是它使用#import指令,传递库 DLL 的位置,然后它执行using namespace LIBRARYNAME,然后它能够​​创建一些未定义的类型(我假设它已定义在 DLL 中)并使用 __uuidof 创建它的新实例。从那时起,要调用其中一个库函数,该示例只需执行createdObj->foo() 即可

嗯... g++ 的 #import 与 VC++ 的 import 不同(见这里),所以这个例子对我不起作用。

有什么办法可以将它转换为在 g++ 下编译,或者我是 SOL,直到库开发人员为我提供一个我可以试用的静态库?

0 投票
4 回答
3878 浏览

c++ - 为什么我的新操作员不叫

我想看看一个动态加载的库(用 dlopen 等加载)真的使用它自己的新的删除操作符,而不是调用程序中定义的这些操作符。所以我写了以下 library.cpp

并用

或作为受雇俄罗斯人建议尝试(但最终没有任何改变)

Base 类只保存一个 int 值和一个函数 get_value() 来获取这个值。之后我像这样写了client.cpp

并用

执行客户端我只得到一个“新的客户端调用”和一个“删除客户端调用”。即使我像 Employed Russian 建议的那样为库使用编译器开关 -Bsymbolic。

现在:出了什么问题?我认为共享库正在使用他们自己的 new/delete,因此您必须在工厂旁边提供在库代码中创建析构函数销毁。

补充问题:为什么我需要 destroy(Base* p) 函数?如果这个函数只调用客户端的delete-operator,我也可以自己做,即“delete a”而不是最后一行的destroy_module(a)。

我找到的答案:该库还可以提供一个新/删除操作符对。因此,如果我首先使用库的新功能,然后使用客户端的删除功能,我可能会陷入陷阱。可悲的是,直到现在我从未见过我的图书馆使用它自己的新图书馆或删除图书馆......所以最初的问题仍然没有得到回答。

补充:我只指Linux平台。

编辑:重要部分在“雇佣俄罗斯人的回答”的评论中。所以我简而言之给出主要线索:如果有人以这种方式调用 gcc

该库将使用它自己的新/删除运算符。否则结果

在使用调用程序的新/删除运算符的库中。感谢受雇的俄罗斯人!

0 投票
1 回答
998 浏览

g++ - g++ 符号版本控制。使用 g++ 版本 4 将其设置为 GCC_3.0

我需要实现一个 Java 类,它使用 JNI 来控制安装了 sun-java6-jdk 的 XUbuntu 8.10 中的财务打印机。

结构如下:

EpsonDriver.java 加载 libEpson.so

libEpson 与 EpsonF​​iscalProtocol.so(由 Epson 提供,无可用源)和 pthread 动态链接

我使用javah生成头文件,代码编译。然后我把 libEpson.so 放在 $JAVA_HOME/jre/lib/i386 中,EpsonDriver.java 使用静态初始化器

但是,当我尝试使用任何方法时,该部分有效,我得到一个 unsatisfiedLinkError 异常。

前段时间,一位同事做了一个可行的版本,并使用 objdump -Dslx 我得到了以下信息:

在最近编译的文件中,我得到:

所以我怀疑主要区别是 GCC_3.0 符号

我使用以下命令编译 libcom_tichile_EpsonSerialDriver.so(从内存中,因为我现在不在工作)

有没有办法告诉 g++ 使用那个符号版本?或者任何关于如何使它工作的想法?

编辑:我有另一个带有以下转储的非工作版本:

现在我认为主要区别在于 GCC_3.0 符号/ABI

编辑:幸运的是,一位同事找到了一种使用 Java 与打印机交谈的方法

0 投票
1 回答
132 浏览

g++ - i386mingw32-g++ 未创建:(

我已经在 Linux 中安装了 MinGW 交叉编译器,但我无法创建i386mingw32msvc-g++,因此我无法交叉编译我的 C++ 应用程序。必须做些什么来创建它?

/usr/local/cross-tools/bin,我有所有这些可执行文件,

  • i386-mingw32-addr2line
  • i386-mingw32-ar
  • i386-mingw32-as
  • i386-mingw32-gcc
  • i386-mingw32-gcc-3.4.2
  • i386-mingw32-gccbug
  • i386-mingw32-c++filt
  • i386-mingw32-cpp
  • i386-mingw32-尺寸
  • 等等

但不是 i386mingw32msvc-g++

如何在 bin 中创建它?

0 投票
3 回答
8360 浏览

c++ - 编译 C++ 代码时出现 ios::nocreate 错误

同时,编译一个包,在 RHEL 5.0 上用 C++ 编写。我收到以下错误。

> 错误:nocreate不是成员std::ios

源代码对应于:

ifstream tempStr( argv[4], ios::in| ios::nocreate);


我试过了

#g++ -O -Wno-deprecated <file.cpp> -o <file>

也:

#g++ -O -o <文件>

请提出解决方案。