gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:19:26 25 4
gpt4 key购买 nike

由于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com