gpt4 book ai didi

c++ - 静态库中可用的二进制变量消失

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:19 24 4
gpt4 key购买 nike

我有提到的问题。我在静态库中创建了一个对象,当我在静态库上运行 nm 时,它就在那里,但是当我将 lib 链接到二进制文件并运行 nm 时,它就消失了.我知道以前有人问过这个问题,但我找不到任何答案。能够在二进制文件中保留该变量对我来说很重要,因为我们正在尝试对二进制文件中的静态库实现版本检查。请帮忙。谢谢。示例代码如下:

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;
}

构建

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. 确保应用程序中至少有一个目标文件依赖于库中的相关目标文件。

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

关于c++ - 静态库中可用的二进制变量消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3881325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com