在静态库中可用的二进制variables消失

我有提到的问题。 我在一个静态库中创build了一个对象,当我在静态库上运行nm时,它就在那里,但是当我把这个库链接到一个二进制文件并运行nm它就消失了。 我知道这个问题之前已经被问过了,但我找不到任何答案。 对于我来说,能够在二进制文件中保留该variables是非常重要的,因为我们正在试图对二进制文件中的静态库进行版本检查。 请帮忙。 谢谢。 示例代码如下:

test.h

 #ifndef TEST_H #define TEST_H class Test { public: Test(); }; extern Test* gpTest; #endif 

TEST.CPP

 #include "test.h" Test::Test() { gpTest = this; } Test test; 

main.cpp中

 #include "test.h" #include <iostream> using namespace std; Test* gpTest = NULL; int main() { return 0; } 

build立

 g++ -c test.cpp -o test.o ar cr test.a test.o g++ main.cpp -o app -L/home/duminda/intest/test.a 

nm -C test.a

 0000000000000054 t global constructors keyed to _ZN4TestC2Ev 000000000000002b t __static_initialization_and_destruction_0(int, int) 0000000000000016 T Test::Test() 0000000000000000 T Test::Test() U __gxx_personality_v0 U gpTest 0000000000000000 B test 

nm -C app

 0000000000600e10 d _DYNAMIC 0000000000600fe8 d _GLOBAL_OFFSET_TABLE_ 0000000000400754 t global constructors keyed to gpTest 0000000000400858 R _IO_stdin_used w _Jv_RegisterClasses 0000000000400717 t __static_initialization_and_destruction_0(int, int) U std::ios_base::Init::Init()@@GLIBCXX_3.4 U std::ios_base::Init::~Init()@@GLIBCXX_3.4 0000000000601050 b std::__ioinit 0000000000600df0 d __CTOR_END__ 0000000000600de0 d __CTOR_LIST__ 0000000000600e00 D __DTOR_END__ 0000000000600df8 d __DTOR_LIST__ 0000000000400968 r __FRAME_END__ 0000000000600e08 d __JCR_END__ 0000000000600e08 d __JCR_LIST__ 0000000000601038 A __bss_start U __cxa_atexit@@GLIBC_2.2.5 0000000000601028 D __data_start 0000000000400810 t __do_global_ctors_aux 0000000000400670 t __do_global_dtors_aux 0000000000601030 D __dso_handle w __gmon_start__ U __gxx_personality_v0@@CXXABI_1.3 0000000000600ddc d __init_array_end 0000000000600ddc d __init_array_start 0000000000400770 T __libc_csu_fini 0000000000400780 T __libc_csu_init U __libc_start_main@@GLIBC_2.2.5 0000000000601038 A _edata 0000000000601058 A _end 0000000000400848 T _fini 00000000004005a0 T _init 0000000000400620 T _start 000000000040064c t call_gmon_start 0000000000601038 b completed.6096 0000000000601028 W data_start 0000000000601040 b dtor_idx.6098 00000000004006e0 t frame_dummy 0000000000601048 B gpTest 000000000040070c T main 

如果程序中没有引用库中的对象文件,那么连接器没有理由将该对象文件包含在可执行文件中。 链接器被设计为仅从库中选择解决打开依赖关系所需的那些部分。

使用静态链接时,唯一的选择是:

  1. 不要使用库,而是将所有相关的对象文件明确地传递给链接器
  2. 确保应用程序中至少有一个对象文件依赖于库中的相关对象文件。

也许动态链接可以在这里提供帮助,但是我不确定。

优化编译器/链接器 – 你没有在main()中使用gpTest,所以它不会被添加到代码中。 如果您在main()函数中放置一个reference / use,它将会重新出现。

我找到了我正在寻找的东西:D。 看起来,链接器标志--whole-archive整个--whole-archive在那里,以确保静态库中的所有符号,而不管它们是否被应用程序访问或不进入应用程序。 虽然我仍然有麻烦得到这个工作,我想我是在正确的道路上。