Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.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++ 为什么新的VS2013项目';如果文件为.cpp,则在链接中无法解析s函数,但如果文件为.c,则为ok_C++_C_Visual Studio 2013 - Fatal编程技术网

C++ 为什么新的VS2013项目';如果文件为.cpp,则在链接中无法解析s函数,但如果文件为.c,则为ok

C++ 为什么新的VS2013项目';如果文件为.cpp,则在链接中无法解析s函数,但如果文件为.c,则为ok,c++,c,visual-studio-2013,C++,C,Visual Studio 2013,我正在将所有本机库链接到WPF应用程序中使用的.dll 我对其他编译成libs的项目也这样做过,但最近的一个项目不知怎么地不起作用,尽管所有项目似乎都是这样。我喜欢这样: .h: .cpp: MyLoginResultCB被导入到WPF exe并从那里调用。在初始化过程中,从native.dll中的C文件调用MySetLoginResultCallback 在.dll链接中,我从MySetLoginResultCallback(在native.c文件中调用)中获得未解决的错误。如果我保持标题完全

我正在将所有本机库链接到WPF应用程序中使用的.dll

我对其他编译成libs的项目也这样做过,但最近的一个项目不知怎么地不起作用,尽管所有项目似乎都是这样。我喜欢这样:

.h:

.cpp:

MyLoginResultCB被导入到WPF exe并从那里调用。在初始化过程中,从native.dll中的C文件调用MySetLoginResultCallback

在.dll链接中,我从MySetLoginResultCallback(在native.c文件中调用)中获得未解决的错误。如果我保持标题完全相同,重命名.cpp->.c并删除外部“c”,则.dll链接成功。我错过了什么

来自aini.c.的电话

MySetLoginResultCallback(XpAfterLoginCB);
错误:


1 > AI.Obj:LNK2019错误:未解决的外部符号MyStReLogin RealTraceRealBoad引用在.cpP文件中函数yInNOAKIT

< P>,您定义了一个函数:代码> MyStReLogInReultTraceBuff< /Cuff>用C++语言链接。这是一个不同于.h文件中声明了C语言链接的函数
MySetLoginResultCallback

正确的解决方案是将C语言链接添加到.cpp文件:

extern "C" {

typedef int(*LoginResultCB_t)(int IsOk, const char *UserName);
LoginResultCB_t             gLoginResultCB;

void MySetLoginResultCallback(LoginResultCB_t pCB)
{
    gLoginResultCB = pCB;
}

}

请注意,函数类型也有语言链接,这意味着typedef
LoginResultCB\u t
也必须在.cpp文件中用C语言链接声明,因为参数在.h文件中声明为C语言链接。

原因是只有在其他项目/libs中使用的.h文件中的定义是,我在带有定义的.cpp文件中包含了带有函数声明的头文件。感谢@molbdnilo指出这一点

你能展示一下你是如何使用这些功能的吗?还包括确切的错误(完整且未编辑,最好是整个构建日志)?您是否忘记在“.cpp”中包含标题?您的意思是:在.cpp中包含标题?我为什么要这么做?我是从一个.c文件调用的,有一个头文件included@matti
extern“C”
必须应用于定义,否则函数将无法获得C链接。它不会因为某个头在某处声明了这样一个函数而神奇地变成一个带有C链接的函数。@matti我忘记了一个有点让人困惑的细节:如果编译器在编译定义时已经“看到”了
extern“C”
声明,它会自动应用。这就是为什么在源文件中包含头文件时它会起作用。谢谢。我完全按照我在别处描述的方式做了。所以外部“C”只在头中为在native.dll中调用的函数定义。它在那里工作。我尝试你的建议,但我不明白为什么“我的方式”在其他项目中有效。再次感谢。现在我想知道我是否应该提出另一个问题,为什么我的方法与另一个lib一起工作,如果它不应该。。。。
MySetLoginResultCallback(XpAfterLoginCB);
extern "C" {

typedef int(*LoginResultCB_t)(int IsOk, const char *UserName);
LoginResultCB_t             gLoginResultCB;

void MySetLoginResultCallback(LoginResultCB_t pCB)
{
    gLoginResultCB = pCB;
}

}