所以我有 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)
...
...
现在,我明白了这个链接错误是因为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,而不是在配置上#include "pugixml.cpp"
。我正在使用遗留代码,所以这些惊喜就在那里。现在,我已经解决了我的问题,并使我的公司代码稍微干净一些。