我有一個非常簡單的共享庫,有兩個功能。 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;
}