c++ - 链接到命名空间中的函数时出现 GNU 链接器错误

标签 c++ linker gnu

我正在尝试将我的应用程序与我创建的静态库相关联。尽管任何全局函数和类方法都可以毫无问题地链接,但链接到命名空间中声明的函数会产生错误“未定义对 [namespace]::function 的引用”。这是示例:

包含文件包含:

void global_function (void);

namespace vm  
{  
void my_namespace_function (void);  
class some_class  
 {  
 static void my_class_function (void);  
 }  
};  

cpp 文件包含:

using namespace vm;

int main ()  
{  
global_function();      // this is fine  
some_class::my_class_function();      // this is fine  
my_namespace_function();   // "undefined reference to vm::my_classless_function()"  
return 0;  
}  

是的,我确实检查了 vm::my_namespace_function() 是否真的在库中。
感谢您的帮助。

最佳答案

您需要在声明的同一命名空间中实现您的函数:

[文件“namespace_func.cpp”]

#include    "namespace_func.h"
#include    <iostream>

void global_function( )
{
    std::cout << "global_function" << std::endl;
}

namespace vm
{
    void my_namespace_function( )
    {
        std::cout << "my_namespace_function" << std::endl;
    }

    void some_class::my_class_function( )
    {
        std::cout << "some_class::my_class_function" << std::endl;
    }
};

[文件“namespace_func.h”]

#ifndef _NAMESPACE_FUNC_H
    #define _NAMESPACE_FUNC_H

void global_function( );

namespace vm
{
    void my_namespace_function( );
    class some_class
    {
    public:
        static void my_class_function( );
    };
};

#endif  // _NAMESPACE_FUNC_H

然后你可以链接到你的“namespace_main.cpp”:

#include    "namespace_func.h"

using namespace vm;

int main ( )
{
    global_function( );      // this is fine
    some_class::my_class_function( );      // this is fine
    my_namespace_function( );   // Fine. NO "undefined reference to vm::my_classless_function()"

    return 0;
}

命令行:

g++ -Wall namespace_main.cpp namespace_func.cpp -o namespace

输出是:

$ ./namespace 
global_function
some_class::my_class_function
my_namespace_function
  • 注意:您无需像在“C”中那样声明接收“( void )”的函数。将其留空。

关于c++ - 链接到命名空间中的函数时出现 GNU 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5276200/

相关文章:

linux - 关机后恢复 screen 缓冲区

c++ - 如何在内部使用 C++ 异常并可以在旧平台上运行的 linux x64 上创建共享库对象?

c++ - 在 C++ 中返回指向对象指针的指针

c++ - 在 C++ 中访问 lambda 之外的 lambda 捕获初始化变量

c++ - 静态变量初始化顺序

linux - 并排差异 (-y) : how to hide the reverse-video ^M (at end-of-line)?

c++ - 直接从已安装的 Windows 光栅(位图)字体获取位图

c - 在 GNU ld 映射文件中包含静态符号?

linux - 使用 CMake 创建二进制文件会删除运行时路径

regex - 来自 dos 窗口的带有 "or"的 grep 命令行 (gnu grep)