c++ - G++ 和 LTO : how to separate declaration and definition?

标签 c++ g++ inline lto

由于 LTO 可以解析来自其他目标文件的 inline 符号,我尝试将 inline 函数的声明和定义分开。这是3个文件,dep.hppdep.cppmain.cpp,其中main.cppdep.cpp 链接在一起并且 dep.hpp 在两者中都是 #included:

// dep.hpp, declaration
#ifndef _DEP_HPP_
#define _DEP_HPP_
inline void sayHello();
#endif

// dep.cpp, definition
#include "dep.hpp"
#include <iostream>

inline void sayHello() {
    std::cout << "Hello World!" << std::endl;
}

// main.cpp, caller
#include "dep.hpp"

int main(int argc, char** argv) {
    sayHello();
}

这是 G++ 打印的错误:

In file included from main.cpp:1:
dep.hpp: At global scope:
dep.hpp:4:13: warning: inline function 'void sayHello()' used but never defined
 inline void sayHello();
             ^~~~~~~~
C:\Users\vtonc\AppData\Local\Temp\ccojskQy.ltrans0.ltrans.o:<artificial>:(.text+0x15): undefined reference to `sayHello()'
collect2.exe: error: ld returned 1 exit status

命令行:

@echo off
g++ main.cpp dep.cpp -o example.exe -flto -Wall -Wextra
pause

当启用 -flto 并且 sayHello() 本身是 inline< 时,为什么链接器会提示未定义的 sayHello()/? LTO 不应该处理这种情况吗?

我正在使用 mingw-w64 8.1.0 x86_64-posix-seh

最佳答案

inline 的全部要点是您必须在调用函数的同一翻译单元中提供函数的定义。

打开编译器优化不会改变这一点;这是语言的规则。

将定义移动到标题。

关于c++ - G++ 和 LTO : how to separate declaration and definition?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57220421/

相关文章:

c++ - 我如何知道内联函数是否在被调用的地方被实际替换?

c++ - 编译错误boost属性树c++

c++ - 如何防止此无锁堆栈函数中的未定义行为和 ABA 问题?

c++ - 使用 g++ -m32 选项编译 C++

C++如何确定函数是否具有内联能力并且实际上是?

c# - 具有引用参数/参数或匿名函数的 Func/Action 委托(delegate)

c++ - XCode 4.4.1 - C++ - Apple Mach-O 链接器 (ID) 错误 - 找不到架构 i386 的符号

c# - 面向 future 的大型 UI 应用程序 - 具有 2008 功能包的 MFC 或 C# 和 Winforms?

c++ - C++ 中的全局对象表示重复符号

c++ - FFTW 在 Windows 机器上链接 g++ 错误