g++ 相关问题

g ++是GNU编译器集合(gcc)的C ++前端。

std::atexit 函数在 MSVC 编译器中不起作用吗?

我想在退出程序时运行一个带参数且返回值为void的函数。我使用以下代码来实现它: #包括 #包括 使用

回答 1 投票 0

致命错误:使用 x86_64-w64-mingw32-gcc 时无法执行 cc1 execvp”

我正在尝试使用以下命令编译文件: x86_64-w64-mingw32-gcc反向.cpp -o反向.exe -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-con...

回答 1 投票 0

错误:矩阵相乘时没有用户提供的默认构造函数

我有一些非常基本的代码,我认为不会导致问题: #包括 ... mat4x4 m = mat4x4(1.0f); m = 旋转(m, (浮动) glfwGetTime(), vec3(0.0f, 0.0f, 1.0f)); 我...

回答 1 投票 0

C++ 编译器在宏扩展中存在模板参数问题

我对 g++ 和 clang++ 进行了测试,并在今天早些时候编写一些单元测试时经历了这一点,并得出了 MWE: #定义 EXPECT_EQ(A, B) 模板 C类{

回答 1 投票 0

Make 省略 '-I' 标志 g++

我有一个 makefile 来制作一个包含 2 个源文件和一个标头的项目。 .PHONY:干净删除运行 CC = g++ CFLAGS = -g -墙 CXXFLAGS = $(CFLAGS) SRC = /home/user/dev/nCPrograms/Flagger/src/theclass...

回答 1 投票 0

SDL2/_real_SDL_config.h:没有这样的文件或目录

我一直在尝试在 WSL (Ubuntu) 上设置 SDL2 并使用 cmake 和 mingw 交叉编译到 Windows。我遇到了这个问题,尝试编译库文件本身失败: 在文件中

回答 3 投票 0

在 C++ 中使用模板更改运算符顺序时出错

我正在编写以下模板化向量类。 矢量.h: #ifndef INCLUDE_HEADERS_VECTORS_H #define INCLUDE_HEADERS_VECTORS_H 模板 类 Vector2D; 模板 我正在编写以下模板化向量类。 向量.h: #ifndef INCLUDE_HEADERS_VECTORS_H #define INCLUDE_HEADERS_VECTORS_H template<class Scalar> class Vector2D; template<class Scalar> Vector2D<Scalar> operator+(Scalar a, Vector2D<Scalar> v); template<class Scalar> class Vector2D { public: Vector2D(); Vector2D(Scalar a, Scalar b); Scalar getX(); Scalar getY(); Vector2D<Scalar> operator+(Scalar a); friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); private: Scalar x, y; }; #endif 向量.cpp: #include<headers/vectors.h> template<class Scalar> Vector2D<Scalar>::Vector2D() { x = 0; y = 0; } template<class Scalar> Vector2D<Scalar>::Vector2D(Scalar a, Scalar b) { x = a; y = b; } template<class Scalar> Scalar Vector2D<Scalar>::getX() { return x; } template<class Scalar> Scalar Vector2D<Scalar>::getY() { return y; } template<class Scalar> Vector2D<Scalar> Vector2D<Scalar>::operator+(Scalar a) { return Vector2D<Scalar>(a + x, a + y); } template<class Scalar> Vector2D<Scalar> operator+(Scalar a, Vector2D<Scalar> v) { return Vector2D<Scalar>(a + v.x, a + v.y); } template class Vector2D<float>; template Vector2D<float> operator+<float>(float a, Vector2D<float> v); 主要.cpp: #include<headers/vectors.h> #include<iostream> int main(int argc, char* argv[]){ Vector2D<float> a(1.0, 3.0); std::cout<<a.getX()<<" "<<a.getY()<<std::endl; a = (float)2.0 + a; std::cout<<a.getX()<<" "<<a.getY()<<std::endl; a = a + (float)-2.0; std::cout<<a.getX()<<" "<<a.getY()<<std::endl; return 0; } 当我尝试在 Windows 上使用 g++ 编译它时,出现以下错误: g++ -Iinclude -Iinclude/SDL2 -Iinclude/headers -Llib -o Main src/*.cpp -lmingw32 -lSDL2main -lSDL2 -lSDL2_image In file included from src/Main.cpp:2: include/headers/vectors.h:29:33: error: declaration of 'operator+' as non-function 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^~~~~~~~ include/headers/vectors.h:29:41: error: expected ';' at end of member declaration 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^ | ; include/headers/vectors.h:29:43: error: expected unqualified-id before '<' token 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^ In file included from src/vectors.cpp:1: include/headers/vectors.h:29:33: error: declaration of 'operator+' as non-function 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^~~~~~~~ include/headers/vectors.h:29:41: error: expected ';' at end of member declaration 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^ | ; include/headers/vectors.h:29:43: error: expected unqualified-id before '<' token 29 | friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); | ^ src/vectors.cpp:70:18: error: non-class, non-variable partial specialization 'operator+<Scalar>' is not allowed 70 | Vector2D<Scalar> operator+<Scalar>(Scalar a, Vector2D<Scalar> v) { | ^~~~~~~~~~~~~~~~~ src/vectors.cpp: In instantiation of 'Vector2D<Scalar> operator+(Scalar, Vector2D<Scalar>) [with Scalar = float]': src/vectors.cpp:96:69: required from here src/vectors.cpp:71:35: error: 'float Vector2D<float>::x' is private within this context 71 | return Vector2D<Scalar>(a + v.x, a + v.y); | ~~^ include/headers/vectors.h:37:16: note: declared private here 37 | Scalar x, y; | ^ src/vectors.cpp:71:44: error: 'float Vector2D<float>::y' is private within this context 71 | return Vector2D<Scalar>(a + v.x, a + v.y); | ~~^ include/headers/vectors.h:37:19: note: declared private here 37 | Scalar x, y; | ^ mingw32-make: *** [MakeFile:2: all] Error 1 但是,如果我更改 vectors.h 中 + 运算符声明的顺序,如下所示,它将正常工作。 #ifndef INCLUDE_HEADERS_VECTORS_H #define INCLUDE_HEADERS_VECTORS_H template<class Scalar> class Vector2D; template<class Scalar> Vector2D<Scalar> operator+(Scalar a, Vector2D<Scalar> v); template<class Scalar> class Vector2D { public: Vector2D(); Vector2D(Scalar a, Scalar b); Scalar getX(); Scalar getY(); friend Vector2D<Scalar> operator+ <>(Scalar a, Vector2D<Scalar> v); Vector2D<Scalar> operator+(Scalar a); private: Scalar x, y; }; 我完全不知道为什么会发生这种情况。 我尝试删除模板,问题消失了,所以它一定是相关的。 一般来说,模板函数的定义不应放在单独的 .cpp 文件中。相反,它们应该在模板中的 .h 文件中定义。这个答案消除了 .cpp 文件。 这避免了到处不断重复template< typename Scalar >的麻烦。更重要的是,它允许编译器自动内联它们。 此外,operator+还有一个习惯用法,即首先定义operator+=,然后将operator+实现为隐藏好友,从而调用operator+=。见下文。 // vectors.h #ifndef INCLUDE_HEADERS_VECTORS_H #define INCLUDE_HEADERS_VECTORS_H template<class Scalar> class Vector2D { Scalar x{}; // default member-initialization sets x to 0 Scalar y{}; // default member-initialization sets y to 0 public: Vector2D() = default; Vector2D(Scalar a, Scalar b) : x{ a } // use base-member initization, rather than assignment. , y{ b } {} Scalar getX() const // "getter" function declared with const { return x; } Scalar getY() const // "getter" function declared with const { return y; } // Compound assignment operator returns a reference to `this` object. // Within its definition, class template `Vector2D` does not need // a template argument. Avoid `Vector2D<Scalar>`. Vector2D& operator+= (Vector2D const& v) { x += v.x; y += v.y; return *this; } // Use hidden friend idiom to define `operator+`. // Left operand is a value parameter. friend Vector2D operator+ (Vector2D a, Vector2D const& b) { return a += b; } // As before, compound assignment operator returns a reference to // `this` object. Within its definition, class template `Vector2D` // does not need a template argument. Avoid `Vector2D<Scalar>`. Vector2D& operator+= (Scalar a) { x += a; y += a; return *this; } // Provide two versions of `operator+` for Scalar operand. // That way, the Scalar can appear on either side of the `+` sign. // Once again, these are hidden friends. // The vector is passed by value. friend Vector2D operator+ (Scalar const a, Vector2D v) { return v += a; } friend Vector2D operator+ (Vector2D v, Scalar const a) { return v += a; } }; #endif // end file: vectors.h 输出 文件main.cpp与OP相比没有变化。 1 3 3 5 1 3

回答 1 投票 0

当我尝试使用 g++ 进行编译并且使用 macOS 时,我收到有关构造函数的错误:没有匹配的构造函数用于初始化[关闭]

我有一个完全正常的代码(一个 cpp 和一个 cpp 文件)和一个 makefile,但是当我尝试用 g++ 编译它时,我得到这个: g++ -std=c++11 -c subject.cpp -o subject.o 在主题包含的文件中......

回答 1 投票 0

为什么 g++ 即使使用 C++11 也无法识别 stoi?

我在C++11中有这个函数: 布尔 ccc(常量字符串 cc) { 矢量数字; 国际辅助; for(int n = 0; n < cc.length(); ++n) { digits.push_back(to_string(cc[n])); } ...

回答 1 投票 0

当我尝试使用 g++ 编译时出现此错误

我有一个完全正常的代码(一个 cpp 和一个 cpp 文件)和一个 makefile,但是当我尝试用 g++ 编译它时,我得到这个: g++ -std=c++11 -c subject.cpp -o subject.o 在主题包含的文件中......

回答 1 投票 0

使用可选<string>是否揭示了 gcc 中的错误?

我已将代码简化为以下示例,该示例在我的 g++ (x64 12.3) 上进行 -O3 C++20 编译失败,并且在使用 godbolt 时显然在 14.1 上失败: 再次根据 godbolt 的说法,clang 无需 ...

回答 1 投票 0

在未命名的命名空间内外可以有两个具有相同名称的函数吗?

有以下代码: #包括 使用命名空间 std; 名称空间 { int funkcja() { 计算<< "unnamed" << endl; return 0; } } int funkcja(...

回答 2 投票 0

GCC/G++ 链接问题。有点菜鸟问题

我有一个使用 cmake 构建的项目。该项目在一个目录中创建一个库 (.a),然后应用程序(来自另一个目录)链接到该库中。它使用 GCC 作为com...

回答 1 投票 0

C++ 中引用是否作为空指针传递?

tl;博士;传递给函数的引用与 nullptr 初始化指针具有相同的地址。每个引用都作为 nullptr 传递吗? 使用 g++ 和 gedit(无 IDE)在 Ubuntu (Ubuntu 22.04.4 LTS) 上工作,使用 f...

回答 1 投票 0

如何将 VCPKG 库与 G++ 链接

我已经完全安装并运行了 vcpkg(安装在 C:/vcpkg 中),并且安装了我想要使用的库,在本例中为 cppzmq/zmq (ZeroMQ)。 头文件和 .lib 文件位于 C:/

回答 1 投票 0

OpenMP for 循环比串行代码花费更多时间

我尝试使用 OpenMP 并行化代码片段,结果发现使用 OpenMP 需要 25 倍的时间才能完成程序。有什么不对的吗?我该如何优化它? #包括 我尝试使用 OpenMP 并行化代码片段,结果发现使用 OpenMP 需要 25X 时间才能完成程序。有什么不对的吗?我该如何优化它? #include <iostream> #include <cmath> #include <random> #include <chrono> #include <cstdlib> #include <omp.h> using namespace std; int main() { unsigned long long black_square = 1, digit_square = 13; //auto n = ((black_square)<<11) * static_cast<unsigned long long>(pow(digit_square,10)); auto n = static_cast<unsigned long long>(1e9); srand(0); int tmp = 0; std::random_device rd; // Will be used to obtain a seed for the random number engine std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd() std::uniform_int_distribution<> distrib(1, 6); auto tStart = std::chrono::high_resolution_clock::now(); //#pragma omp parallel for schedule(static) reduction(+:tmp) #pragma omp parallel for schedule(static) reduction(+:tmp) num_threads(8) for (unsigned long long i=0; i<n; i++) tmp = (tmp+(5==rand()%6))%static_cast<int>(1e9); //for (unsigned long long i=0; i<n; i++) tmp = (tmp+(5==distrib(gen)))%static_cast<int>(1e9); tmp%=static_cast<int>(1e9); auto tEnd = std::chrono::high_resolution_clock::now(); cout << tmp << " obtained after " << n << " iterations in " << (tEnd-tStart).count()/1e9 << "s." << endl; return 0; } 代码由g++ -o a.out -O3 -std=c++11 -fopenmp tmp.cpp编译,其中g++的版本为8.5.0 20210514。操作系统是RHEL8.9,有20个Intel Xeon CPUs at 2.593GHz。 串行代码平均运行时间为7.4s,而并行代码平均运行时间为180s。选项 -O3、-O2、-O1 具有相似的结果。随机生成器mt19937可以显着缩小性能差距,但并行代码仍然比串行版本慢得多。增加或减少 n 也会导致类似的结果。 rand()函数不需要是线程安全的。因此,像您所做的那样同时从多个线程调用它是不安全的 glibc 的 rand() 版本是线程安全的,但它是通过将整个函数包装在互斥体中来实现的。因此一次只有一个线程可以调用 rand()。由于在 rand 调用之外,您的代码执行的操作非常少,几乎所有执行时间都将在 rand() 内。 所以并行版本并不是真正的并行。每次调用 rand() 时,每个线程轮流一次执行一个。所以它比单线程没有优势。但实际上更糟糕的是,因为线程必须争夺谁获得互斥锁,在每次调用后唤醒和睡眠,并在每个 CPU 核心的缓存之间移动 PRNG 状态。所以比单线程差很多。 您应该做的是创建多个 PRNG 实例。有一个 gen 对象数组,每个线程一个。每个线程应该使用自己的 PRNG。确保每个对象在内存中相距足够远,不会共享缓存行,因此 PRNG 状态不需要在 CPU 缓存之间移动。

回答 1 投票 0

Mingw32 std::isnan 与 -ffast-math

我正在使用 -ffast-math 选项编译以下代码: #包括 #包括 #包括 int main() { std::cout << std::isnan(std::numeric_...

回答 2 投票 0

R中由于文件路径指定错误导致的c++/g++包编译问题的解决方案

当我尝试安装从源代码(特别是 rstan)编译的软件包时,我在 R/RStudio 中遇到了两次问题,因为 R 始终在错误的位置查找 g++ 编译器。

回答 1 投票 0

又一个警告:“<anonymous>”可能会在未初始化的情况下使用

我看到了许多关于同一警告的其他问题,但我的代码似乎不同。 而且,总的来说,我只能通过 -Os 选项才能得到这个。 #包括 使用命名空间 std ; 模板 我看到了许多其他关于同一警告的问题,但我的代码似乎不同。 而且,总的来说,我只能通过 -Os 选项才能得到这个。 #include <iostream> using namespace std ; template <class TYPE,class FUNC> struct AutoDestruct { const TYPE & var ; FUNC func ; AutoDestruct ( const TYPE & v , FUNC f ) : var(v),func(f) {} ~AutoDestruct () { func(var) ;} }; class Dictionary { public: Dictionary & wipe () { cout << "Dictionary.wipe()\n" ; return *this ;} }; static void wipe_dict ( Dictionary * dict ) { dict->wipe() ;} typedef AutoDestruct<Dictionary*,void(*)(Dictionary*)> AutoWipe ; int main () { cout << "enter main function " << __DATE__ << " " << __TIME__ << endl ; Dictionary headers ; AutoWipe auto_wipe( &headers,wipe_dict ) ; cout << "exit main function\n" ; } 命令行是: g++ -std=c++11 -Os -Wall -Wextra test.cpp && ./a.out N.B.:如果我删除 -Os 选项,我不会收到任何警告。 输出是: test.cpp: In function ‘int main()’: test.cpp:9:48: warning: ‘<anonymous>’ may be used uninitialized [-Wmaybe-uninitialized] 9 | ~AutoDestruct () { func(var) ;} | ^~~~ test.cpp:25:46: note: ‘<anonymous>’ was declared here 25 | AutoWipe auto_wipe( &headers,wipe_dict ) ; | ^ enter main function May 13 2024 20:14:01 exit main function Dictionary.wipe() 编译器是: g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 这是我真实代码的一个非常简单的摘录,只是为了暴露警告。 但请注意,在我的真实代码中,执行 auto_wipe 时,我收到警告 AND 段错误! 知道警告+段错误原因吗? 预先感谢! 我认为走一小段路是值得的,因为我想我不是唯一一个最初误读你的代码的人。我认为我正在阅读的代码是这样的: #include <iostream> using namespace std; template <class TYPE,class FUNC> struct AutoDestruct { TYPE& var ; FUNC func ; AutoDestruct(TYPE& v, FUNC f ) : var(v),func(f) {} ~AutoDestruct () { func(var) ;} }; struct Dictionary { Dictionary & wipe () { cout << "Dictionary.wipe()\n" ; return *this ;} }; static void wipe_dict ( Dictionary & dict ) { dict.wipe() ;} typedef AutoDestruct<Dictionary,void(*)(Dictionary&)> AutoWipe ; int main () { Dictionary headers ; AutoWipe auto_wipe( headers,wipe_dict) ; } auto_wipe 存储对 headers 的引用,当调用它的析构函数时,它会调用 headers.wipe();。然后调用 headers 析构函数,一切都很好。 虽然在你的代码中,这里: AutoWipe auto_wipe( &headers,wipe_dict ) ; 您的 auto_wipe 存储对临时 &headers 的引用。当 auto_wipe 的析构函数被调用时,对象 headers 当然仍然存储在相同的内存地址中。然而,由 &headers 产生的临时指针早已消失,并且该成员是一个悬空引用。您可以按照注释中的建议复制指针,也可以按照上面的方式存储对实际对象的引用。 TL;DR:编译器发出警告是正确的。您存储一个悬空引用。使用地址消毒剂会突出这个问题。

回答 1 投票 0

链接低版本编译器编译的动态库有什么潜在问题吗?

这样的情况下有没有潜在的问题? 我的项目使用g++11.4编译,而我无法控制的所需动态库则使用g++8.2编译。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.