2013-07-24 87 views
-1

我有一個非常簡單的共享庫,有兩個功能。 hello1()在lib.cpp文件中定義,而hello2()在頭文件(lib.hpp)中定義。 hello1()和hello2()未聲明爲內聯。爲什麼不使用共享庫符號中定義的符號?

我然後一個測試程序,其包括從共享庫和對共享庫鏈接報頭。該TEST.CPP程序執行兩個功能: 的#include「xdaq_headers/lib.h」

int main() { 
    hello1(); 
    hello2(); 
} 

如所預期的,當我改變hello1()定義在lib.cpp並重新編譯的共享庫,該執行測試程序時可以看到更改。

然而,如果我修改hello2在標題()的定義和重新編譯的共享庫,那麼這些更改不會在測試程序執行期間可見。

只有重新編譯TEST.CPP變化後可見。

我的開發平臺是:

  • Linux的2.6.18-348.12.1.el5 CEST 2013 x86_64的x86_64的x86_64的GNU/Linux的
  • 海合會(GCC)4.1.2

1)爲什麼我有這種行爲?

2)我怎麼能爲了改變Makefile文件或頭(但不是在.cpp)只需要庫的重新編譯,以使更改生效。

3)如果原因是,該函數是由編譯器內聯(即,用於被短?),我怎樣才能避免這種行爲?我曾嘗試以下方法(和組合)W/O型很成功......雖然我不放棄,我做錯了什麼:像

  • 添加__attribute__((noinline始終))在lib.hpp (克++只):

    void hello2() __attribute__ ((noinline)); 

    void hello2() { 
     asm(""); 
     std::cout
  • 添加標誌-fno - 缺省 - 內嵌在編譯器標記。
  • 添加asm("");在hello2()的定義以模擬副作用。

lib.hpp:

#ifndef _mylib_lib_hpp_ 
#define _mylib_lib_hpp_ 

#include <iostream> 

void hello1(); 

void hello2() { 
    std::cout << "hello2(): first implementation" << std::endl; 
} 

#endif 

lib.cpp: 的#include 「xdaq_headers/lib.h」

#include <iostream> 

void hello1() { 
    std::cout << "hello1(): second implementation" << std::endl; 

} 

回答

2

由於hello2在頭定義,測試程序將使用它來代替共享庫的版本。所以如果你修改頭文件,你需要重新編譯測試程序。如果您希望只能重新編譯共享庫,則需要將hello2的定義(即代碼)移出標題並移至其他cpp文件中。

相關問題