从未调用的函数中获取损坏的 C++ 符号

问题描述 投票:0回答:1

我想生成包含的标头的符号名称,而不调用任何函数。

例如,如果我有一个标头 mylib.hpp:

namespace ns {

class MyClass{
    public:
    void printHello();
};
}

在 use_mylib.cpp 中我只包含该标头:

#include "mylib.hpp"

如果我使用

g++ -c use_mylib.cpp -o symbols.o
进行编译,symbols.o 将不包含任何符号,因为没有调用任何函数。有没有办法让编译器声明它有一个损坏的 ns::MyClass::printHello()
_ZN2ns7MyClass10printHelloEv
符号,即使它没有被调用?

我希望 g++ 中的开关能够在

symbols.o
中发出未调用的函数符号,但这没有任何意义,因为它们是未调用的函数。是否有一个用户可调用的工具来获取 .cpp 文件中所有损坏的名称,即使它们未被调用?

您可能会问我为什么要这样做。 我正在尝试生成共享库,并且只需编译源一次。我想发布仅定义了“公共”符号的库,但我也想针对我未发布的符号进行测试。 “一切公开,然后剥离符号”的方法。是我正在看的东西。理想情况下,我可以 #include 所有公共标头来生成所需的损坏的导出,这是目前流程中的长杆。

c++ g++ clang++ abi name-mangling
1个回答
0
投票

符号名称将位于具有函数定义的翻译单元 (.cpp) 文件中。标头只有声明,没有定义。

如果您只想公开可用的符号子集,则需要在构建公共版本时预先链接该库,但是在测试时,您应该能够针对正常构建的静态库进行测试并访问这些符号,因为所有由于目标文件尚未链接在一起,因此非静态符号将存在于静态库中。

© www.soinside.com 2019 - 2024. All rights reserved.