G++ 和 LTO:如何分离声明和定义?

G++ and LTO: how to separate declaration and definition?

由于 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 的重点是您必须在调用函数的同一翻译单元中提供函数的定义。

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

将定义移至页眉。