C++ 链接的可执行文件中的静态库中缺少符号

C++ 链接的可执行文件中的静态库中缺少符号,c++,linker,g++,C++,Linker,G++,我有一个问题,链接的可执行文件中缺少静态库符号。 以下是我的问题描述: 我有从几个对象文件构建的静态库。这些对象文件提供了七组符号,这些符号与: 一组C函数和结构(几个对象文件)。让我们将相应的符号称为level1符号 一组C++函数类,用于C函数和结构(另一个对象文件)。让我们将相应的符号称为level2符号 一组C++扩展包类,继承了2级类(另一个对象文件),具有扩展功能。让我们将相应的符号称为3级符号 Underground C代码使用其他几个项目和外部库。其中一些是静态的,所以目前这个库

我有一个问题,链接的可执行文件中缺少静态库符号。 以下是我的问题描述:

我有从几个对象文件构建的静态库。这些对象文件提供了七组符号,这些符号与:

  • 一组C函数和结构(几个对象文件)。让我们将相应的符号称为level1符号
  • 一组C++函数类,用于C函数和结构(另一个对象文件)。让我们将相应的符号称为level2符号 一组C++扩展包类,继承了2级类(另一个对象文件),具有扩展功能。让我们将相应的符号称为3级符号 Underground C代码使用其他几个项目和外部库。其中一些是静态的,所以目前这个库也是静态的

    库与可执行文件链接。此文件仅直接使用lib中的level2符号。但此可执行文件在执行期间加载的某些动态库需要3级符号

    问题是,由于某种原因,此可执行文件(nm已批准)中缺少级别3符号

    库本身包含所有符号组。另外还有一个与此库链接的可执行文件,它还包含所有符号组。这些可执行文件之间的主要区别在于,第二个可执行文件(显示所有符号)直接使用leve3符号

    整个项目是在调试配置中使用CMake构建的(这意味着在g++命令中提供了“-g”选项)。底层操作系统是GNU/Linux x86_64。g++版本是4.4

    我检查了几个关于StackOverflow的类似问题,但没有找到任何可接受的解决方案

    我已经尝试了几种链接选项来解决这个问题(--export dynamic、--whole_archive),但都没有帮助

    我很乐意看到任何解决这个问题的方法,或者至少是这种奇怪行为的可能原因

    这是用于构建可执行文件的命令行。命令由CMake生成。我只添加--whole_archive选项,然后删除可执行文件并重新运行命令。我还希望您能原谅我用“?”替换所有项目特定的名称

    exec_name—我们正在讨论的可执行文件的名称
    lib_name-我们正在讨论的库的名称

    /usr/bin/c++-符号链接到g++v4.4可执行文件


    /usr/bin/c++-Wextra-g-fPIC CMakeFiles/exec_dir.dir/main.cpp.o CMakeFiles/exec_dir.dir/options.cpp.o CMakeFiles/exec_dir.dir/runtime.cpp.o CMakeFiles/exec_dir.dir/main.cpp.o CMakeFiles/CServer.cpp.o-o-o exec_name-rdynamic../lib/???/lib../../lib/???/??/lib???.a../../../lib???/lib???.a../../lib/???/lib???.a-ldl-lboost\u文件系统-lboost\u信号-lboost\u系统-lboost\u线程../../lib/???/lib/?/lib线程../../usr/local ssl/lib64/libcrypto.so-ldl-luuid-lodbc../lib/log/lib???.so../lib/config/lib-a-lpthread/.a-rpath,/home/beduin/???/build/deb/???/lib/???:/home/beduin/???/build/deb/lib/???:/usr/local/ssl/lib64

    使用
    -rdynamic-Wl,-整个归档-Wl,-没有完整的归档文件
    -您的一个LIB不在
    -完整的归档文件

    -完整的归档文件和-rdynamic是解决这个问题的方法-您能显示生成可执行文件的命令行吗?我已经在问题中添加了comamndline。请尝试
    -rdynamic-Wl,-完整的归档文件-Wl,-没有完整的存档
    -看起来您的某个库不在其中--整个存档工作正常!谢谢你的帮助!我是StackOverflow的新手,有什么办法可以扩大你的声誉吗?那么,我怎样才能通过再次修改我的帖子来标记正确的答案呢?@beduin:我会发布一个答案-然后你可以接受我的建议:解释为什么
    -整个归档文件
    会有帮助。类似Stackexchange的网站不仅仅为发布问题的人提供可用的资源。一般来说,除了发布原始问题的个人之外,我看不到有多少一行回答对任何人都有帮助。整个档案是否会转储标记为隐藏的符号?我的可执行文件在添加这个时跳了不少。