【问题标题】:Debian gcc undesirable behaviourDebian gcc 不良行为
【发布时间】:2018-11-07 09:58:53
【问题描述】:

我正在创建一个具有静态库依赖项的 gcc 共享库。

我编译静态库的部分如下:

gcc -c -m64 -O2 -fPIC -std=c99 -Wall  ms*.c //there are 10 C files, no warnings

接下来我创建一个静态库:

ar rc static_lib.a ms*.o

接下来我为我的程序编译以下部分:

g++ -c -m64 -O2 -fPIC -std=c++14 -Wall  ab*.cpp //there are 5 C++ files, just -Wunused-variable warnings

然后我创建一个共享库如下:

g++ -shared -g -Wall ab*.o static_lib.a -o shared_lib.so

在正常情况下,这个 shared_lib.so 将由 Ruby 程序使用外部函数接口调用。如果我在 ubuntu 或 mac(.dylib) 上执行此操作没有问题,但如果我在 debian 拉伸上尝试此操作,则会收到 与静态库相关的错误,好像配置设置不正确。如果我在没有外部函数接口的情况下运行应用程序,例如创建一个测试器并使用cpp文件主函数运行如下:

> g++ -o library_test ab*.o static_lib.a
> ./library_test

没问题!

我的问题是,这里可能缺少用于创建共享库的哪种配置,以免出现不良行为。尤其是在 debian 拉伸 9.5 上! 或者如果共享库有问题,有什么方法可以让我理解。

【问题讨论】:

  • 你得到的错误是什么?当你得到错误时你真的会做什么?您可以尝试创建一个Minimal, Complete, and Verifiable Example 向我们展示吗?
  • 我得到的错误与静态库有关,因为它非常具体,我没有看到在这里发布它的任何意义。简而言之,为了创建静态库以删除某些功能并以特定方式运行某些功能,我们定义了一个配置文件,包括以下行:#define M_NO_ASSEMBLY #define M_MAX_BASE 64 ..... 共享库似乎不在乎这些配置.
  • 说真的,错误很具体,还是你不提吗?具体的错误是好的。
  • 库特定的错误也很好。这是“非法模数”错误。为模数的除数定义了一个配置 M_DIVISOR,共享库似乎不关心这个配置。但是,当我在命令行上测试它时,我没有任何问题。
  • 这是一个奇怪的错误。我认为这是来自库本身的错误消息,而不是来自链接器。显然要判断我们需要库的源代码,但源代码完全有可能以某种方式依赖于宏M_DIVISOR

标签: c++ shared-libraries c++14 static-libraries debian-stretch


【解决方案1】:

从 cmets 中,您指出问题出在 #define 上。这些是预处理器指令。库用于链接器

您可能会感到困惑,因为g++ 确实包含预处理器阶段,并且可能会根据请求的输出调用链接器。不过,g++ 遵循 C++ 语言规则。

【讨论】:

  • 我用g++编译静态库时解决了这个问题。感谢您的回答。
  • 我接受这个答案,因为这是最有帮助的。
猜你喜欢
  • 2014-06-06
  • 2021-06-06
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
相关资源
最近更新 更多