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

发布于 2024-10-21 15:31:04 字数 662 浏览 5 评论 0原文

我正在尝试将我的应用程序与我创建的静态库链接。尽管链接任何全局函数和类方法都没有问题,但链接到命名空间中声明的函数会生成错误“对 [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() 是否实际上在库中。
感谢您的帮助。

I'm trying to link my app with a static library that I've created. Though any global functions and class methods are linked with no problem, linking to functions declared in namespaces generate errors "undefined reference to [namespace]::function". Here is example:

include file contains:

void global_function (void);

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

cpp file contains this:

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;  
}  

And yes, I did check whether vm::my_namespace_function() is actually within a library.
Thanks for help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绮筵 2024-10-28 15:31:04

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

[file "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;
    }
};

[file "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 )”。将其留空即可。

You need to implement your functions in the same namespace as declared:

[file "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;
    }
};

[file "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

Then you can link to your "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;
}

Command line:

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

The output is:

$ ./namespace 
global_function
some_class::my_class_function
my_namespace_function
  • note: you don't need to declare your functions to receive "( void )" as in "C". Just leave it empty.
半衬遮猫 2024-10-28 15:31:04

你如何得到a

 "undefined reference to vm::my_classless_function()"

当你调用my_namespace_function();

?您检查过您对图书馆的期望吗?

How do you get a

 "undefined reference to vm::my_classless_function()"

when you call my_namespace_function();?

Did you check what you expect in library?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文