C++ &引用;外部C";与C+分离的函数+;共享对象符号表

C++ &引用;外部C";与C+分离的函数+;共享对象符号表,c++,linux,linker,g++,osx-lion,C++,Linux,Linker,G++,Osx Lion,我有一个为项目创建的共享对象库,我遇到了一个奇怪的问题,在最终的库符号表中找不到我声明为“extern C”的函数。我正在将带有函数的对象文件链接到库中,但由于某些原因,它们不在符号表中。这是在Linux和OS X上发生的。我正在使用g++进行链接和编译 编辑: 我在链接时没有收到任何链接器错误。图书馆的链接很好。我可以看出函数不在库中,因为我检查了符号表,它们不在库中。我用于链接的命令如下所示: g++ -m64 -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/

我有一个为项目创建的共享对象库,我遇到了一个奇怪的问题,在最终的库符号表中找不到我声明为“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();
}
}

您的链接器优化选项
-Wl,-O1
可能正在删除未使用的代码。也就是说,如果您的代码库本身不调用extern C函数,则链接器在优化时可能会将其作为未使用的代码忽略。

试试
-Wl,-O0
,看看问题是否消失。如果是,则链接器选项是罪魁祸首。

当您试图链接您创建的库时,是否会出现链接器错误?是否可以包括一个最小的完整示例以及确切的生成命令?也许您可以提供一些详细信息,例如,哪个版本的g++。您如何确定共享库没有公开符号。您如何构建共享库(需要确切的命令行)。实际上,在我第一次重新链接它时它就工作了,但我有一些函数名需要更改。我修改了它们,然后重新构建了项目,它们不再显示在符号表中。你确定你的重建是完全`-Wl,-O1?是的,我对我的解决方案进行了完全重建。我确保删除旧库并重新构建所有对象。在将
-Wl,-O1
更改为
-Wl,-O0
后,我没有修改生成文件。您可以将生成文件发布到原始问题吗?也许这将进一步说明问题。如果您试图编译一些使用库中某些外部“C”函数的代码,会怎么样?当你尝试这样做时会发生什么?我无法发布Makefile,因为它包含敏感材料。我将尝试将代码编译到库中。