2012-08-06 47 views
1

如果我有一個將被編譯爲共享對象的類。 該類在.h文件中聲明並在.cpp文件中實現。內嵌方法不可用作共享庫的符號

這個類包含幾個內聯方法

如果我寫了一些程序與此共享庫鏈接的,包括.h文件, 我會鏈接時,它得到未定義參考錯誤。

這是因爲沒有爲內聯方法導出的符號?

我能理解這個嗎?

UPDATE:一些示例代碼下面

somelib.h

#ifndef __ABC_LIB_H 
#define __ABC_LIB_H 
#include <iostream> 
class ABC { 
    ABC(); 
    ~ABC(); 
    inline void not_callable_outside_library(); 
    void callable_outside_library(); 
}; 
#endif 

somelib.cpp

#include "somelib.h" 
ABC::ABC() {} 
ABC::~ABC() {} 
void ABC::not_callable_outside_library(){ std::cout<<"not_callable_outside_library"<<std::endl; } 
void ABC::callable_outside_library(){ std::cout<<"callable_outside_library"<<std::endl; } 

program.cpp

#include "somelib.h" 
int main() { 
    ABC x; 
    x.not_callable_outside_library(); 
    return 0; 
}; 

將somelib.cpp編譯爲共享庫(.so對象)並將其鏈接到program.cpp,然後獲取名爲程序的二進制文件。

現在你應該得到一個未定義的參考鏈接時。

+0

應該不需要任何內聯方法的符號。向我們展示一些代碼和錯誤。 – 2012-08-06 03:55:02

+1

你是正確的,內聯函數不提供鏈接的外部定義。至於你的錯誤,你應該構造你的類定義,以便你不直接依賴於共享對象之外的內聯函數。 – chrisaycock 2012-08-06 04:00:12

+0

LuchianGrigore見上面; @chrisaycock感謝您的確認。豎起大拇指 ! – average 2012-08-06 04:11:35

回答

5

內聯函數必須在頭文件中定義。對比你有以下幾點:

somelib.h:

#ifndef ABC_LIB_H 
#define ABC_LIB_H 

#include <iostream> 
class ABC { 
    ABC(); 
    ~ABC(); 
    void not_callable_outside_library(); 
    void callable_outside_library(); 
}; 

inline void ABC::not_callable_outside_library() { 
    std::cout << "not_callable_outside_library\n"; 
} 

#endif 

somelib.cpp:

#include "somelib.h" 

ABC::ABC() { } 
ABC::~ABC() { } 
void ABC::callable_outside_library() { 
    std::cout << "callable_outside_library\n"; 
} 

program.cpp:

#include "somelib.h" 

int main() { 
    ABC x; 
    x.not_callable_outside_library(); 
}