c - 为什么在 C 程序中内联函数时会出现与 clang 的链接错误?
问题描述
为什么以下程序不能用 clang 编译?
#include <stdio.h>
inline int f() {
return 42;
}
int main() {
printf("%d\n", f());
}
我得到以下信息:
$ clang -o inline inline.c
Undefined symbols for architecture arm64:
"_f", referenced from:
_main in inline-975155.o
ld: symbol(s) not found for architecture arm64
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
但是我可以用clang++编译它就好了。inline
C 与 C++之间是否存在细微差别?
解决方案
在 C99 中,当编译器无法内联时,您需要提供函数的替代(非内联)定义。见https://clang.llvm.org/compatibility.html#inline
一种可能对您有用的解决方案是将定义设为静态:
#include <stdio.h>
static inline int f() {
return 42;
}
int main() {
printf("%d\n", f());
}
将按您的预期工作。
clang
以下是链接页面上列出的所有选项:
- 更改添加到静态内联函数。如果只有一个翻译单元需要使用该功能,这通常是正确的解决方案。静态内联函数总是在翻译单元中解析,因此您不必在程序的其他地方添加函数的非内联定义。
- 从此定义中删除 inline 关键字
f
。内联函数不需要 inline 关键字,也不保证一定会这样。一些编译器完全忽略它。Clang 将其视为程序员的温和建议。f
提供程序中其他地方的外部(非内联)定义。这两个定义必须是等价的!- 通过将 -std=gnu89 添加到 Clang 选项集以编译 GNU C89 方言。仅当程序源无法更改或程序还依赖于无法更改的其他 C89 特定行为时,才建议使用此选项。
推荐阅读
- python-3.x - 在单个 URL 调用中读取格式错误的 CSV(连接 3 个 csv)
- java - 保存时如何使用实体中的配置文件设置值
- javascript - 将图标图像绑定到它们各自的名称然后渲染
- html - 如何使图像适合其容器 - 动态执行
- java - java.lang.OutOfMemoryError:在 Jmeter 负载测试期间超出了 GC 开销限制
- java - 在android代码上执行model.forward时应用程序崩溃,我不知道为什么?
- vb.net - 将文本写入输出文件时的进度条
- java - BoxCars Java 程序 - 初学者。奇怪的问题:程序不在控制台中运行,但它在 Eclipse 中没有列出任何错误
- python - 为重新采样的分位数值创建单独的 pandas df
- python - 登录后通过网页解析并从表中提取数据