Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果两个静态lib包含pugixml objs,如何避免“已定义”的pugixml链接错误?_C++_Visual Studio_Linker Errors_Pugixml - Fatal编程技术网

C++ 如果两个静态lib包含pugixml objs,如何避免“已定义”的pugixml链接错误?

C++ 如果两个静态lib包含pugixml objs,如何避免“已定义”的pugixml链接错误?,c++,visual-studio,linker-errors,pugixml,C++,Visual Studio,Linker Errors,Pugixml,我有两个静态lib,定义如下: StaticLib1 // StaticLib1.h #pragma once class StaticLib1 { public: void doSomething1(); }; cpp: StaticLib2 // StaticLib2.h #pragma once class StaticLib2 { public: void doSomething2(); }; cpp: Main #include <iostream> #in

我有两个静态lib,定义如下:

StaticLib1

// StaticLib1.h
#pragma once

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

StaticLib2

// StaticLib2.h
#pragma once

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

Main

#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;
}
现在,我知道这个链接错误是因为在
StaticLib1.lib
中有一个
pugixml.obj
,在
StaticLib2.lib
中有一个
pugixml.obj
。但我不明白为什么这会导致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比在配置中包含“pugixml.cpp”
更好。我正在处理遗留代码,所以这些惊喜就在那里。现在,我已经解决了我的问题,并使我的公司代码稍微干净了一些。

#include“pugixml.cpp”
是一个非常糟糕的主意。好吧,所以我对此进行了评论。现在,我找不到
pugi::xml_node node
的引用,因为在
pugixml.objs
中有这些引用。那么,创建一个静态pugixml库是否更好?因此,应该定义
pugi::xml_node node
的引用,“创建静态pugixml库是否更好?”似乎是一个更好的选择是的。否则,其他库的顺序也可能很重要。您还可以将它们与
pugixml o
对象文件一起放入链接器对象组。请注意,包含pugixml.cpp对您不起作用的主要原因是define仅为pugixml_头\u-您在define中有一个输入错误,因此您是在源代码模式下编译pugixml的。
#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)
...
...
#ifndef HEADER_PUGICONFIG_HPP
#define HEADER_PUGICONFIG_HPP

#define PUGIXML_WCHAR_MODE

#define PUGIXML_HEAD_ONLY
#include "pugixml.cpp"

#endif