我的构建显然有问题,但我无法弄明白。我将其缩小到我的一个项目:在清理失败后首先构建,所有后续构建成功。
我得到链接错误,表示某些符号已经定义:
>------ Build started: Project: Problem, Configuration: Debug Win32 ------
> Blah blah blah...
23> Creating library D:\SVN.DRA.WorkingCopy\Debug\Problem.lib and object D:\SVN.DRA.WorkingCopy\Debug\Problem.exp
23>ProblemDependency1.lib(PD1.obj) : error LNK2005: "public: unsigned short __thiscall PD2Class::getFoo(void)const " (?getFoo@PD2Class@@QBEGXZ) already defined in ProblemDependecy2.lib(ProblemDependency2.dll)
23>ProblemDependency1.lib(PD1.obj) : error LNK2005: "public: void __thiscall PD2Class2::`default constructor closure'(void)" (??_FPD2Class2@Image@DRA@@QAEXXZ) already defined in ProblemDependency2.lib(ProblemDependency2.dll)
23>D:\SVN.DRA.WorkingCopy\Debug\Problem.dll : fatal error LNK1169: one or more multiply defined symbols found
有关故障排除的任何提示吗?如果需要,我可以发布更多信息
更新:由于Anders Abel的建议,我解决了第一个错误,但我仍然无法解决第二个问题(关于默认构造函数的问题)
更新:如果我在Visual Studio外部使用MSBuild进行编译,则会始终失败,并出现相同的错误
修改:这是一些代码。首先,一点PD2Class2的声明。 PD2Class2的真名是CImage(感觉懒得匿名),CImage.h:
#pragma once
#pragma warning( disable: 4251 ) //TODO: Disable and solve
#include "ImageProperties.h"
#include "../CommonCppLibrary/CriticalSection.h"
#include <windows.h>
#include <stdexcept>
#include <string>
class CSharedMemory;
class EmptyImageException;
struct IShape;
struct SImageStatics {
unsigned short low3Percentile;
unsigned short high97Percentile;
unsigned short medianPixelValue;
unsigned short meanPixelValue;
unsigned short minPixelValue;
unsigned short maxPixelValue;
};
namespace DRA{
namespace Image{
class __declspec(dllexport) CImage {
friend class CImageLock;
//Attributes
int m_iPitch;
protected:
mutable CImageProperties m_cProperties;
CSharedMemory * m_pSharedMemmory;
mutable DRA::CommonCpp::CCriticalSection m_csData;
static const float PIXEL_FREQUENCY_COVERAGE;
static const float PIXEL_CUTOFF_PERCENTAGE;
static const int MINIMUM_PIXEL_FREQUENCY; //Pixels with a frequency lower than this are ignored
static const int MINIMUM_WINDOW_WIDTH_FOR_16_BITS;
//Methods
//Some private methods
public:
CImage( DWORD dwWidth = 0, DWORD dwHeight = 0, ULONG uBytesPerPixel = 0,
bool isSigned = false, EPhotometricInterpretation ePI = PI_UNKNOWN,
UINT bitsStored = 0, float pw = -1.0f, float ph = -1.0f, BYTE * pData = NULL );
CImage( const CImageProperties& cProperties, int iPitch = 0 );
CImage( const CImage& rImage );
virtual ~CImage();
virtual CImage& operator=( const CImage& );
bool operator==( const CImage& rImage );
//Alter State
//More methods
//Query State
//More methods
};
}
}
接下来,构造函数的定义来自CImage.cpp:
CImage::CImage( DWORD dwWidth, DWORD dwHeight, ULONG uBytesPerPixel, bool isSigned,
EPhotometricInterpretation ePI, UINT bitsStored, float pw, float ph,
BYTE * pData ) :
m_iPitch( dwWidth * uBytesPerPixel ),
m_cProperties( dwWidth, dwHeight, uBytesPerPixel, bitsStored, ePI, isSigned, pw, ph ),
m_pSharedMemmory( NULL ),
m_csData(){
m_pSharedMemmory = new CSharedMemory( pData ? pData : new BYTE[getSize()] );
}
答案 0 :(得分:3)
getFoo()
是否标记为__declspec(dllexport)
?如果它是内联函数,则通过包含的头部从它调用的任何地方实例化/使用它。它不应该是dll导出的函数的一部分,也不应该有dllexport指令。
__declspec(dllexport)
可以通过扩展为dllexport
或dllimport
的宏来处理,具体取决于它是使用编译的dll的dll还是代码。如果函数声明中有任何宏,您可能需要深入研究它是否存在导出指令。
我认为如果在构建dll和使用dll时都使用头文件,则在头文件中使用__declspec(dllexport)
是不正确的。而是使用宏系统:
#ifdef PROBLEMDEPENDENCY2
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
class DLLEXPORT CImage
{
//...
}
然后在构建dll时定义PROBLEMDEPENDENCY2预处理器符号,但在使用时不定义。头文件中硬编码__declspec(dllexport)
的问题是编译器将尝试从ProblemDependency2(这是正确的)和ProblemDependency1(这是不正确的)导出类。
答案 1 :(得分:3)
我最近遇到的一件事就是检查:
您是在构建网络卷吗?我一直遇到无法调试我的应用程序的问题,因为.pdb文件在构建之后和调试启动之前没有因为我作为构建目录工作的SAN中的延迟而没有“存在”。
一旦我将项目构建移动到本地卷,一切都很好。
不知道这是不是你发生了什么事,而是我要研究的事情。
答案 2 :(得分:3)
我没有太多的c ++经验,但是在其他.NET语言中出现这样的问题,通常是因为在同一个解决方案中对另一个项目的DLL引用(对于“obj”或“bin”文件夹中的DLL)这是另一个项目,而不是项目引用。这使得Visual Studio无法找出构建顺序,因此,在“干净”之后的第一次,您将不会拥有您所依赖的DLL。第二次构建,这个DLL已经构建完成,构建将成功。