在链接包含相同名称的类的库时,GCC是否有办法产生警告?例如

港口

class Port {
public:
  std::string me();
};

Port.cpp
#include "Port.h"
std::string Port::me() { return "Port"; }

假端口
class Port {
public:
  std::string me();
};

FakePort.cpp
#include "FakePort.h"
std::string Port::me() { return "FakePort"; }

main.cpp
#include "Port.h"

int main() {
  Port port;
  std::cout << "Hello world from " << port.me() << std::endl;
  return 0;
}

build
# 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

更改图书馆顺序
# g++ main.o FakePort.a Port.a
# ./a.out
  Hello world from FakePort

根据this page:



因此,上述行为是有道理的。不幸的是,我继承了一个相当大的代码库,该代码库不使用 namespace (并且现在无法添加 namespace ),并且在多个库中使用了一些通用的类名。我想在链接时自动检测重复的名称,以确保不会错误地实例化错误的类拷贝。就像是:
# g++ -Wl,--warnLibraryDupSymbols main.o FakePort.a Port.a
  Warning: Duplicate symbol: Port

但是我无法在GCC链接器选项中找到任何东西来做到这一点。是否有可能让GCC自动检测并报告此类情况?

最佳答案

以下可能值得一试(老实说,我不知道它是否会满足您的要求):



我没有尝试过,但听起来好像它会将库中的所有项目都拉进来,就好像它们是目标文件一样。您需要为每个库指定选项。

正如Neil所说,这不会给您类冲突,但是如果有具有相同签名的类成员,这可能会使链接程序告诉您。

关于c++ - 使用GCC将库与重复的类名链接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2766022/

10-11 15:26
查看更多