C++ 静态库中的内联函数被来自用户项目的同名函数替换

C++ 静态库中的内联函数被来自用户项目的同名函数替换,c++,inline,static-linking,C++,Inline,Static Linking,我需要以某种方式为我的每个静态库和使用它们的项目定义模块名。我不能这样做,因为: std::string const module_name = "my module"; 因为我在静态成员初始化期间需要这个值。由于未定义静态数据初始化顺序,因此在尝试使用变量时,module\u name变量仍可能未初始化 为了解决这个问题,我定义了 inline std::string const& module_name() { static std::string const name

我需要以某种方式为我的每个静态库和使用它们的项目定义模块名。我不能这样做,因为:

std::string const module_name = "my module";
因为我在静态成员初始化期间需要这个值。由于未定义静态数据初始化顺序,因此在尝试使用变量时,
module\u name
变量仍可能未初始化

为了解决这个问题,我定义了

inline std::string const& module_name() 
{
    static std::string const name = "my module";
    return name;
}
对于每个模块。但这不起作用,因为所有
module\u name()
调用都已解析为使用来自父模块的实现(
module\u name()
始终返回父可执行项目的名称)。我不明白为什么。我希望,因为这个内联函数是在静态库中定义和使用的,所以应该捕获实际的模块名。是因为编译器没有内联这个函数吗

是否有任何建议的方法来解决此问题


编译器:VC++10和gcc,在VC++10上测试,具有外部链接的实体在一个程序中只能有一个定义,因此在一个程序中不能有同一函数的多个定义也就不足为奇了

这与内联无关,链接器看到同一符号的多个定义(这通常发生在模板实例化和内联函数以及使用动态libs时的其他符号中),并选择一个定义来使用

要使每个库都有一个单独的定义,您需要它们具有内部链接,这可以通过使函数为静态或将其置于未命名的命名空间中,或使用特定于平台的方法来实现,例如
\uu dllimport
\uu属性((可见性(“隐藏”))
告诉编译器该符号是共享库专用的,不应导出(因此不会被同一符号的另一个定义替换)


或者,只需将每个模块放在自己的名称空间中,并将函数放在该名称空间中,那么每个函数都是不同的,它们不会相互干扰。

那么。。。名称空间?@Xeo:我不需要在一百个地方明确指定
特定的模块名称()?此外,还可能犯错误,例如复制/粘贴。如果您正在调用
模块,则不会发生此错误。
from也在该特定命名空间中。@Xeo:听起来不错,只是它是一个几乎没有命名空间的大型遗留项目