使用GCC链接具有重复类名的库

joe*_*ner 11 c++ gcc

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自动检测并报告此类案件?

Mic*_*urr 4

以下可能值得一试(老实说,我不知道它是否会达到您想要的效果):

--whole-archive

对于命令行上 --whole-archive 选项之后提到的每个存档,请在链接中包含存档中的每个目标文件,而不是在存档中搜索所需的目标文件。这通常用于将存档文件转换为共享库,强制每个对象都包含在生成的共享库中。该选项可以多次使用。

我还没有尝试过,但听起来好像它会像对象文件一样提取库中的所有项目。您需要为每个库指定选项。

正如尼尔所说,这不会给您带来类级别的冲突,但如果存在具有相同签名的类成员,这可能会让链接器告诉您。