C++ 为什么不使用共享库符号中定义的符号?

C++ 为什么不使用共享库符号中定义的符号?,c++,c,shared-libraries,inline,C++,C,Shared Libraries,Inline,我有一个非常简单的共享库,有两个函数。hello1()在lib.cpp文件中定义,而hello2()在头文件(lib.hpp)中定义。hello1()和hello2()未声明为内联 然后我有一个测试程序,其中包括来自共享库的头文件和针对共享库的链接。test.cpp程序执行两个功能: #包括“xdaq_头/lib.h” 正如所料,当我在lib.cpp中更改hello1()定义并重新编译共享库时,这些更改在执行测试程序时可见 但是,如果我修改头中的hello2()定义并重新编译共享库,那么在测试程

我有一个非常简单的共享库,有两个函数。hello1()在lib.cpp文件中定义,而hello2()在头文件(lib.hpp)中定义。hello1()和hello2()未声明为内联

然后我有一个测试程序,其中包括来自共享库的头文件和针对共享库的链接。test.cpp程序执行两个功能: #包括“xdaq_头/lib.h”

正如所料,当我在lib.cpp中更改hello1()定义并重新编译共享库时,这些更改在执行测试程序时可见

但是,如果我修改头中的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或header(而不是.cpp)以便只需要重新编译库就可以使更改生效

3) 如果原因是函数是由编译器内联的(例如,因为函数很短?),我如何避免这种行为?我尝试了以下方法(和组合),但没有取得很大成功。。。尽管我没有放弃我做错了什么:

  • 在lib.hpp中添加_属性_uu((noinline))(仅限g++):
lib.cpp: #包括“xdaq_头/lib.h”

#包括 void hello1(){
std::cout因为头中定义了
hello2
,您的测试程序将使用它而不是共享库的版本。因此,如果您修改头,您需要重新编译测试程序。如果您希望能够重新编译共享库,您需要移动定义(即代码)从头文件中取出hello2,并放入其他cpp文件中

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

    void hello2() __attribute__ ((noinline));

    void hello2() {
      asm("");
      std::cout
#ifndef _mylib_lib_hpp_
#define _mylib_lib_hpp_

#include <iostream>

void hello1();

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

#endif
#include <iostream> void hello1() { std::cout << "hello1(): second implementation" << std::endl; }