由于 LTO 可以从其他目标文件中解析inline
符号,因此我尝试将inline
函数的声明和定义分开。这是 3 个文件,dep.hpp
和dep.cpp
,main.cpp
其中main.cpp
和dep.cpp
链接在一起,并且在两者中dep.hpp
都是#include
d:
// 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
为什么链接器抱怨 undefined sayHello()
when -flto
is enabled 并且sayHello()
它本身是inline
?LTO不应该处理这种情况吗?
我正在使用 mingw-w64 8.1.0 x86_64-posix-seh
。