undefined reference to function当我尝试编译以下项目时,出现链接器错误:
inline void f(double*, double*, double*);
Run Code Online (Sandbox Code Playgroud)
inline void f(double* A, double* B, double* C){ ... }
Run Code Online (Sandbox Code Playgroud)
#include "header.hpp"
int main(){
double *A, *B, *C;
f(A, B, C);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用 进行编译g++ -std=c++11 header.hpp impl.cpp use.cpp。undefined reference to f链接器然后在文件中说use.cpp。
我注意到,如果删除关键字inline,一切都会正常,但我想保留它。
另外,我注意到,如果use.cpp我包含impl.cpp,一切也都可以正常工作,但同样,这不是我想要做的,因为我想使用 files 生成多个二进制文件impl.cpp,impl2.cpp等等,因此硬编码其中之一也是不是这样的。
有什么方法可以让这样的项目编译和链接吗?
说明inline符并不是告诉编译器在进行优化时应该内联该函数。很久以前就出现过这种情况,但同时人们意识到编译器在做出这个决定方面要好得多:
inline 关键字的最初目的是向优化器指示函数的内联替换优先于函数调用,即不执行函数调用 CPU 指令将控制权转移到函数体,而是执行函数的副本函数体在不生成调用的情况下执行。这避免了函数调用(传递参数并检索结果)产生的开销,但可能会导致更大的可执行文件,因为函数的代码必须重复多次。
由于关键字 inline 的含义是非绑定的,因此编译器可以自由地对任何未标记为内联的函数使用内联替换,并且可以自由地生成对任何标记为内联的函数的函数调用。这些优化选择不会改变有关上面列出的多个定义和共享静态的规则。
inline当你想定义一个内联函数时你需要;)。在你的例子中,inline将允许你有
inline void f(double*, double*, double*) {}
Run Code Online (Sandbox Code Playgroud)
在标题中。当链接器找到该函数的多个定义时(因为标头可以包含在多个源中),链接器不会抱怨,因为您将其声明为inline.
该代码旨在进行基准测试,我想防止调用函数的开销
如果消除调用函数的开销是一种可行的优化,则编译器将意识到这一点并采取相应的行动。
| 归档时间: |
|
| 查看次数: |
325 次 |
| 最近记录: |