【问题标题】:Statically linked libraries not running code inside to setup static variables静态链接库不在内部运行代码来设置静态变量
【发布时间】:2010-06-17 20:20:25
【问题描述】:

在我正在处理的一个 c++ 项目中,我有一个简单的 c++ 文件,它需要在程序执行开始时运行一些代码。这个文件被链接到一个静态库中,然后被链接到主程序中。

我在其他文件中有类似的代码运行良好,看起来像:

bool ____nonexistent_value = executeAction();

但是,除非我使用此文件中实现的功能,否则它在此文件中不起作用。如果库被编译为共享库,它确实有效。我更喜欢静态链接它,因为库只是一种方便,因为文件位于不同的目录中。

更新(解决方案):

现在创建共享库而不是静态库可以使一切正常。稍后我将研究如何让所有东西都与静态库链接。感谢大家的帮助!

【问题讨论】:

  • 与这个问题无关,这里已经讨论过很多次了,并且没有可移植的解决方案,但是像____nonexistant_value这样的名称在用户编写的C++代码中是非法的。跨度>
  • '它不起作用'因为它编译但在运行时没有值?还是由于缺少定义而无法编译?
  • 感谢所有回复!我在下面找到了我的问题的答案,但我感谢所有帮助!我不知道以下划线开头的名字是非法的,我只是认为他们不鼓励。抱歉含糊其辞。程序运行时,不会调用该函数。我已经通过使用一个非常简单的测试(仅输出的单行函数)进行了确认。谢谢大家的时间!

标签: c++ linker static-linking


【解决方案1】:

如果该特定文件中没有引用任何符号,则链接器不会包含该文件。你有两个选择:

  1. 从库中删除文件并将其(对象或源文件)直接包含在命令行中以进行编译/链接。然后该文件应该包含在可执行文件中。
  2. 在您从其他文件(例如具有 main() 定义的文件)中引用的文件中有一个符号,这应该在链接期间“拉”该文件。

【讨论】:

  • 感谢您的回答!我感觉这是问题所在,谢谢您的确认!
【解决方案2】:

我不确定是否有办法保证静态库中的这种静态分配,但您始终可以明确说明。为您的库提供一个 init 函数,该函数将从 main 调用以设置您需要的所有内容。这样您就不必担心链接器会忽略明显未使用的代码等。

【讨论】:

  • 感谢您的回复!我试图执行的代码是为了在主程序中注册对象。静态库类似于 libtool 的帮助程序库。我主要是在寻找一种在对象的源文件中调用对象特定函数的方法。看来我无论如何都必须想出一个不同的解决方案。
【解决方案3】:

静态初始化没有保证的顺序。你要非常小心!

【讨论】:

  • 感谢您的回复!我知道没有顺序,我使用的代码只是将对象注册到对象工厂(基于某些标识符)。顺序无关紧要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多