所以我有2个静态库,如下所示:

静态库1

// StaticLib1.h
#pragma once

class StaticLib1
{
public:
  void doSomething1();
};


cpp:

// StaticLib1.cpp
#include "pugixml.hpp"
#include "StaticLib1.h"

void StaticLib1::doSomething1()
{
  pugi::xml_node node;
}


静态库2

// StaticLib2.h
#pragma once

class StaticLib2
{
public:
  void doSomething2();
};


cpp:

// StaticLib1.cpp
#include "pugixml.hpp"
#include "StaticLib2.h"

void StaticLib2::doSomething2()
{
  pugi::xml_node node;
}


主要

#include <iostream>
#include "StaticLib1.h"
#include "StaticLib2.h"

int main(int argv, char** argc)
{
  StaticLib1 staticlib1;
  StaticLib2 staticlib2;

  staticlib1.doSemething1();
  staticlib2.doSemething2();

  getchar();
  return 0;
}


现在,如果我建立这个。我收到很多链接错误。以下是前几个链接错误:

3>StaticLib2.lib(StaticLib2.obj) : error LNK2005: "public: __thiscall pugi::xml_attribute::xml_attribute(struct pugi::xml_attribute_struct *)" (??0xml_attribute@pugi@@QAE@PAUxml_attribute_struct@1@@Z) already defined in StaticLib1.lib(StaticLib1.obj)
3>StaticLib2.lib(StaticLib2.obj) : error LNK2005: "public: __thiscall pugi::xml_attribute::xml_attribute(void)" (??0xml_attribute@pugi@@QAE@XZ) already defined in StaticLib1.lib(StaticLib1.obj)
3>StaticLib2.lib(StaticLib2.obj) : error LNK2005: "private: __thiscall pugi::xml_attribute_iterator::xml_attribute_iterator(struct pugi::xml_attribute_struct *,struct pugi::xml_node_struct *)" (??0xml_attribute_iterator@pugi@@AAE@PAUxml_attribute_struct@1@PAUxml_node_struct@1@@Z) already defined in StaticLib1.lib(StaticLib1.obj)
...
...


现在,我知道此链接错误是因为pugixml.obj内有一个StaticLib1.lib,而pugixml.obj内有StaticLib2.lib。但是我不明白为什么这会导致与pugixml签名的链接错误。为什么要定义两次?如果我打电话给staticlib1.doSomething1(),主要应该不在乎是否有pugi的多个定义? staticlib1.doSomething1()是否应该处理所有这些?

pugiconfig.hpp上,我具有以下特定设置:

#ifndef HEADER_PUGICONFIG_HPP
#define HEADER_PUGICONFIG_HPP

#define PUGIXML_WCHAR_MODE

#define PUGIXML_HEAD_ONLY
#include "pugixml.cpp"

#endif

最佳答案

因此,是的,从user0042建议中,我意识到最好自己编译pugixml.lib,而不是在配置中包含#include "pugixml.cpp"。我正在使用遗留代码,所以这些惊喜都在那里。现在,我已经解决了问题,并使公司代码更简洁。

关于c++ - 如果两个静态库包含pugixml obj,如何避免与pugixml发生“已定义”链接错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47272810/

10-11 23:08