首先,我已经用C#编写了几年的代码,而且自从我编写任何C代码以来已经很长时间了。我正在使用Visual Studio 2013.我正在为我公司制作的API产品开发示例程序。大部分程序都在一个源文件中。 1个头文件。程序必须解析由API调用返回的XML。显示如何解析XML不是示例的重点,因此我决定程序将定义一个名为GetXmlValue
的简单函数,以隐藏XML解析细节。我在主.C文件中定义了这个函数,如下所示:
//---------------------
// XML processing function forward declaration
// Note that the implementation of this functions is outside the scope of this program. You must implement it yourself
// using a real XML library.
//---------------------
// This function must return a value indicating the number of characters that were copied into the buffer.
// If no characters were copied, the return value should be zero. It's OK if the function returns a negative value
// to indicate that the XPath could not be found.
extern int GetXmlValue(char *xml, char *xpath, char *buffer, int bufferSize);
然后,在一个名为ParseFunction.c的单独文件中,我实现了该函数。一切都编译没有错误,但我得到一个"未解决的外部符号"链接错误:
错误LNK2019:未解析的外部符号" int __cdecl GetXmlValue(char *,char *,char *,int)"函数" int __cdecl parseCommandType(char *)"中引用了(?GetXmlValue @@ YAHPAD00H @ Z); (?parseCommandType @@ YAHPAD @ Z)C:... \ LPRSDK_Sample \ Sample \ Sample.obj
作为一个实验,我在函数中注释了报告错误的行,看看该特定行是否有问题,错误只是移动到调用函数的下一个函数。
如果我将函数的代码移动到示例程序的C文件中,那么一切都会编译和链接。所以它可能在我的链接设置中,但我对整个VS 2013 C语言设置不太熟悉,甚至不知道在哪里看。
我确实检查了日志文件,我看到包含两个源文件的.obj文件,所以我不明白为什么我得到了未解决的外部符号错误。我做错了什么?
答案 0 :(得分:0)
我找到了。一位同事提出了一些建议,他走在了正确的轨道上。
我移动了extern函数的声明,所以它发生在任何typedef之前,然后把它放在" extern" C"阻止,像这样
extern "C" {
int GetXmlValue(char *xml, char *xpath, char *buffer, int bufferSize);
}
现在一切都正确编译和链接。