我正在使用clang-3.6
并编译一个相当大的项目。经过大规模的重新分解后,少数几个看似随机的方法会引起诸如此类的警告:
warning: function 'namespace::X::do_something' has internal linkage but is not defined [-Wundefined-internal]
相同的功能在链接器阶段也显示为缺失。
以下是X.hpp
中一个此类函数定义的匿名标头:
class X {
// ...
void do_something(
foo::Foo& foo,
double a
double b,
double c,
uint8_t d,
const bar::Bar& bar,
int dw, int dh);
// ...
}
该功能正常在X.cpp
中实施。如果Y.cpp
包含X.hpp
并且x->do_something
,则会显示有关内部关联的警告。
上面定义的方法如何具有内部链接?方法获取内部链接的所有情况是什么?
看到这个函数和其他人,用于编译很好,甚至在重构过程中都没有被触及,什么样的副作用(包括顺序,类型Foo和Bar)可以导致方法切换到内部链接?
编辑:
当我执行do_something
的完整源代码grep时,它会给出三个结果:
X.hpp
:void do_something(
X.cpp
:void X::do_something(
Y.cpp
:x->do_something(
我还尝试将do_something
的名称更改为长保证的唯一名称,以排除任何名称冲突的可能性。
据我所知,发布的方法定义无疑是被标记为具有内部链接的方法。
答案 0 :(得分:1)
这是由于其中一种类型(即foo:Foo
)是模板类型,其中一个 模板参数 错误地获得了内部链接。< / p>
template <typename char const* Name> struct Foo{...};
const char constexpr FooBarName[] = "Bar";
using FooBar = Foo<FooBarName>;
FooBar在任何参数列表中的存在或作为返回类型都会给该方法内部链接。即使clang-3.8
-Weverything
extern const char
抱怨有一个带内部链接的模板参数。
明显的解决方法是正确使用{{1}}作为模板字符串参数。