【问题标题】:"extern C" functions disapearing from C++ shared object symbol table“extern C”函数从 C++ 共享对象符号表中消失
【发布时间】:2012-12-21 18:29:13
【问题描述】:

我有一个正在为一个项目创建的共享对象库,我遇到了一个奇怪的问题,即在最终库符号表中找不到我声明为“extern C”的函数。我将目标文件与函数链接到库中,但由于某种原因,它们不在符号表中。这发生在 Linux 和 OS X 上。我使用 g++ 进行链接和编译。

编辑: 链接时我没有收到任何链接器错误。图书馆链接很好。我可以说这些函数不在库中,因为我检查了符号表并且它们不存在。我用于链接的命令如下:

g++ -m64 -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/Qt-4.8.2/lib -shared -Wl,-soname,libQtCommercialChart.so.1 -o libQtCommercialChart.so.1.0.0 ../build/release/lib/chartdataset.o ../build/release/lib/chartpresenter.o ../build/release/lib/charttheme.o ../build/release/lib/domain.o ../build/release/lib/qchart.o ../build/release/lib/qchartview.o ../build/release/lib/qabstractseries.o ../build/release/lib/chartbackground.o ../build/release/lib/chartelement.o ../build/release/lib/scroller.o ../build/release/lib/chartlayout.o ../build/release/lib/versiontracker.o ../build/release/lib/axisanimation.o ../build/release/lib/xyanimation.o ../build/release/lib/pieanimation.o ../build/release/lib/piesliceanimation.o ../build/release/lib/splineanimation.o ../build/release/lib/baranimation.o ../build/release/lib/stackedbaranimation.o ../build/release/lib/percentbaranimation.o ../build/release/lib/abstractbaranimation.o ../build/release/lib/horizontalbaranimation.o ../build/release/lib/horizontalstackedbaranimation.o ../build/release/lib/horizontalpercentbaranimation.o ../build/release/lib/areachartitem.o ../build/release/lib/qareaseries.o ../build/release/lib/chartaxis.o ../build/release/lib/qabstractaxis.o ../build/release/lib/chartvalueaxisx.o ../build/release/lib/chartvalueaxisy.o ../build/release/lib/qvalueaxis.o ../build/release/lib/chartbarcategoryaxisx.o ../build/release/lib/chartbarcategoryaxisy.o ../build/release/lib/qbarcategoryaxis.o ../build/release/lib/chartcategoryaxisx.o ../build/release/lib/chartcategoryaxisy.o ../build/release/lib/qcategoryaxis.o ../build/release/lib/chartdatetimeaxisx.o ../build/release/lib/chartdatetimeaxisy.o ../build/release/lib/qdatetimeaxis.o ../build/release/lib/bar.o ../build/release/lib/abstractbarchartitem.o ../build/release/lib/qabstractbarseries.o ../build/release/lib/qbarset.o ../build/release/lib/qbarmodelmapper.o ../build/release/lib/qvbarmodelmapper.o ../build/release/lib/qhbarmodelmapper.o ../build/release/lib/qbarseries.o ../build/release/lib/barchartitem.o ../build/release/lib/qstackedbarseries.o ../build/release/lib/stackedbarchartitem.o ../build/release/lib/qpercentbarseries.o ../build/release/lib/percentbarchartitem.o ../build/release/lib/qhorizontalbarseries.o ../build/release/lib/horizontalbarchartitem.o ../build/release/lib/qhorizontalstackedbarseries.o ../build/release/lib/horizontalstackedbarchartitem.o ../build/release/lib/qhorizontalpercentbarseries.o ../build/release/lib/horizontalpercentbarchartitem.o ../build/release/lib/qlegend.o ../build/release/lib/legendmarker.o ../build/release/lib/legendlayout.o ../build/release/lib/linechartitem.o ../build/release/lib/qlineseries.o ../build/release/lib/qpieseries.o ../build/release/lib/piesliceitem.o ../build/release/lib/piechartitem.o ../build/release/lib/qpieslice.o ../build/release/lib/qpiemodelmapper.o ../build/release/lib/qvpiemodelmapper.o ../build/release/lib/qhpiemodelmapper.o ../build/release/lib/qscatterseries.o ../build/release/lib/scatterchartitem.o ../build/release/lib/qsplineseries.o ../build/release/lib/splinechartitem.o ../build/release/lib/xychart.o ../build/release/lib/qxyseries.o ../build/release/lib/qxymodelmapper.o ../build/release/lib/qvxymodelmapper.o ../build/release/lib/qhxymodelmapper.o   -L/usr/local/Trolltech/Qt-4.8.2/lib -L/tmp/qcharts/lib/release -Wl,-rpath,/tmp/qcharts/lib/release /home/thinkbox/Desktop/libs/lib/lm_new_pic.o -L/home/thinkbox/Desktop/libs/lib -llmgr_pic -lcrvs_pic -lsb_pic -lact_pic -llmgr_dongle_stub_pic -ldl -lFNPload_pic -lQtGui -L/usr/local/Trolltech/Qt-4.8.2/lib -L/usr/X11R6/lib64 -lQtCore -lpthread

未公开的代码位于文件 versiontracker.o 中。我无法直接显示代码,但它只是在与此类似的庄园中声明的函数:

extern "C"
{
VersionUtils::VersionTracker* AllocateVersion()
{
    return new VersionUtils::VersionTracker();
}
}

【问题讨论】:

  • 当您尝试链接您创建的库时,您会收到链接器错误吗?
  • 您能否提供一个最小的完整示例以及确切的构建命令?
  • 也许您可以提供更多细节——例如,哪个版本的 g++。
  • 你如何确定共享库没有公开符号。
  • 你如何构建共享库(需要确切的命令行)。

标签: c++ linux linker g++ osx-lion


【解决方案1】:

您的链接器优化选项-Wl,-O1 可能会丢弃未使用的代码。 IE。如果您的代码库本身不调用外部 C 函数,则链接器可能会在优化时将它们作为未使用的代码忽略。
试试-Wl,-O0 看看问题是否消失。如果是这样,链接器选项就是罪魁祸首。

【讨论】:

  • 实际上,我第一次重新链接它时它就起作用了,但是我有一些需要更改的函数名称。我修改了它们,然后重新构建了项目,它们不再出现在符号表中。
  • 你确定你的重建完全是 `-Wl,-O1?
  • 是的,我完全重建了我的解决方案。我确保删除旧库并重新构建所有对象。将-Wl, -O1更改为-Wl, -O0后我没有修改Makefile。
  • 您可以将您的 Makefile 发布到原始问题吗?也许这将进一步阐明。如果您尝试编译一些使用库中的一些 extern "C" 函数的代码怎么办?当你尝试时会发生什么?
  • 我无法发布 Makefile,因为它包含敏感材料。我将尝试将代码编译到库中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 2013-09-08
  • 2011-04-25
相关资源
最近更新 更多