我有提到的问题。 我在一个静态库中创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
如果程序中没有引用库中的对象文件,那么连接器没有理由将该对象文件包含在可执行文件中。 链接器被设计为仅从库中选择解决打开依赖关系所需的那些部分。
使用静态链接时,唯一的选择是:
也许动态链接可以在这里提供帮助,但是我不确定。
优化编译器/链接器 – 你没有在main()中使用gpTest,所以它不会被添加到代码中。 如果您在main()函数中放置一个reference / use,它将会重新出现。
我找到了我正在寻找的东西:D。 看起来,链接器标志--whole-archive
整个--whole-archive
在那里,以确保静态库中的所有符号,而不管它们是否被应用程序访问或不进入应用程序。 虽然我仍然有麻烦得到这个工作,我想我是在正确的道路上。