Ошибка компоновщика GNU при связывании с функцией в пространстве имен - PullRequest
3 голосов
/ 11 марта 2011

Я пытаюсь связать свое приложение со статической библиотекой, которую я создал. Хотя любые глобальные функции и методы класса связаны без проблем, ссылки на функции, объявленные в пространствах имен, генерируют ошибки «неопределенная ссылка на [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 () находится внутри библиотеки.
Спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 11 марта 2011

Вам необходимо реализовать свои функции в том же пространстве имен, что и объявленное:

[файл "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
  • примечание: вам не нужно объявлять свои функции для получения "(void)" как в "C".Просто оставьте это пустым.
0 голосов
/ 11 марта 2011

Как вы получаете

 "undefined reference to vm::my_classless_function()"

когда вы звоните my_namespace_function();?

Вы проверили, что вы ожидаете в библиотеке?

...