G++ 和 LTO:如何分离声明和定义?
G++ and LTO: how to separate declaration and definition?
由于 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
当 -flto
启用并且 sayHello()
本身是 inline
时,为什么链接器会抱怨未定义 sayHello()
? LTO 不应该处理这种情况吗?
我正在使用 mingw-w64 8.1.0 x86_64-posix-seh
。
inline
的重点是您必须在调用函数的同一翻译单元中提供函数的定义。
打开编译器优化不会改变这一点;这是语言的规则。
将定义移至页眉。
由于 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
当 -flto
启用并且 sayHello()
本身是 inline
时,为什么链接器会抱怨未定义 sayHello()
? LTO 不应该处理这种情况吗?
我正在使用 mingw-w64 8.1.0 x86_64-posix-seh
。
inline
的重点是您必须在调用函数的同一翻译单元中提供函数的定义。
打开编译器优化不会改变这一点;这是语言的规则。
将定义移至页眉。