2011-03-11 39 views
2

我試圖將我的應用程序與創建的靜態庫鏈接起來。儘管任何全局函數和類方法都沒有問題,但鏈接到名稱空間中聲明的函數會生成錯誤「未定義的對[namespace] :: function的引用」。下面是例子:鏈接到命名空間中的函數時發生GNU鏈接器錯誤

包括文件包含:

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()是否實際上是一個庫中。
感謝您的幫助。

+0

因此,**你是如何編譯/鏈接此代碼? (如果忘記包含.o文件,或者正在使用靜態庫並且鏈接順序錯誤,這一點很重要) – nos 2011-03-11 17:35:20

+1

'some_class :: my_class_function();'怎樣才能正常工作?默認情況下是不是靜態私有? – user634618 2011-03-11 17:44:04

回答

-1

你如何獲得一個

"undefined reference to vm::my_classless_function()" 

當你調用my_namespace_function();

您是否檢查了您對圖書館的期望?

+0

-1應該是原始問題的評論。 – Lou 2011-03-11 17:44:07

+1

哦,對不起所有。 nm上的庫顯示名稱空間函數被標記爲未定義。我將不得不想明白爲什麼。謝謝大家的及時迴應。 – dima1st 2011-03-11 17:47:17

3

您需要實現在同一個命名空間的功能宣稱:

[文件 「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」。只是把它留空。