GCC是否有办法在链接包含具有相同名称的类的库时生成警告?例如
Port.h
class Port {
public:
std::string me();
};
Run Code Online (Sandbox Code Playgroud)
Port.cpp
#include "Port.h"
std::string Port::me() { return "Port"; }
Run Code Online (Sandbox Code Playgroud)
FakePort.h
class Port {
public:
std::string me();
};
Run Code Online (Sandbox Code Playgroud)
FakePort.cpp
#include "FakePort.h"
std::string Port::me() { return "FakePort"; }
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "Port.h"
int main() {
Port port;
std::cout << "Hello world from " << port.me() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
建造
# g++ -c -o Port.o Port.cpp
# ar rc Port.a Port.o
# g++ -c -o FakePort.o FakePort.cpp
# ar rc FakePort.a FakePort.o
# g++ -c -o main.o main.cpp
# g++ main.o Port.a FakePort.a
# ./a.out
Hello world from Port
Run Code Online (Sandbox Code Playgroud)
更改库订单
# g++ main.o FakePort.a Port.a
# ./a.out
Hello world from FakePort
Run Code Online (Sandbox Code Playgroud)
根据这个页面:
如果在两个不同的库中定义符号,gcc将使用它找到的第一个符号并忽略第二个,除非第二个包含在由于某些其他原因而包含的目标文件中.
所以上述行为是有道理的.不幸的是,我继承了一个相当大的代码库,它没有使用命名空间(并且现在添加它们是不可行的)并且在多个库中使用了一些通用的类名.我想在链接时自动检测重复的名称,以确保类的错误副本不会意外地实例化.就像是:
# g++ -Wl,--warnLibraryDupSymbols main.o FakePort.a Port.a
Warning: Duplicate symbol: Port
Run Code Online (Sandbox Code Playgroud)
但是我在GCC链接器选项中找不到任何东西来做到这一点.是否有可能让GCC自动检测并报告此类案件?
以下可能值得一试(老实说,我不知道它是否会达到您想要的效果):
--whole-archive对于命令行上 --whole-archive 选项之后提到的每个存档,请在链接中包含存档中的每个目标文件,而不是在存档中搜索所需的目标文件。这通常用于将存档文件转换为共享库,强制每个对象都包含在生成的共享库中。该选项可以多次使用。
我还没有尝试过,但听起来好像它会像对象文件一样提取库中的所有项目。您需要为每个库指定选项。
正如尼尔所说,这不会给您带来类级别的冲突,但如果存在具有相同签名的类成员,这可能会让链接器告诉您。
| 归档时间: |
|
| 查看次数: |
2458 次 |
| 最近记录: |