C++:错误LNK2019:未解析的外部符号

C++: error LNK2019: unresolved external symbol

本文关键字:外部 符号 错误 LNK2019 C++      更新时间:2023-10-16

以下代码会产生此错误:

error LNK2019: unresolved external symbol "char const * __cdecl nameOnly(char const *)"

法典:

const char* nameOnly(const char* namewpath)
{
    const char* res = namewpath + strlen(namewpath);
    while (res > namewpath) {
        const char* tmp = res - 1;
        if (*tmp == '/' || *tmp == '') break;
        --res;
    }
    return res;
}

上面的代码是一个普通的 C 文件,我正在使用可视化C++编译它。使用 C 编译器编译时,我没有收到此错误。

更新:我尝试使用extern

extern "C"{ 
 const char* nameOnly(const char* namewpath)
 {
    ...
    }
    return res;
 }
}

我收到此错误:

error C2059: syntax error : 'string'

听起来像是函数声明和函数定义之间的差异。

当你说"这段代码是纯 C"时,只有当从C++实现文件中包含头文件时,如果声明被 extern C { ... } 包围,它才是纯 C,否则名称重整就会发挥作用,这就是我认为这个错误的原因。

将代码编译为C++项目的一部分时,需要使用将函数标记为extern "c"的头文件。

内部nameOnly.h

#ifdef __cplusplus
extern "C"{
#endif
const char* nameOnly(const char* namewpath);
#ifdef __cplusplus
}
#endif

然后在nameOnly.c里面:

const char* nameOnly(const char* namewpath)
{
    const char* res = namewpath + strlen(namewpath);
    while (res > namewpath) {
        const char* tmp = res - 1;
        if (*tmp == '/' || *tmp == '') break;
        --res;
    }
    return res;
}

现在,当某些cpp文件包含nameOnly.h时,该函数将被正确标记为extern "C"

extern "C"

将解决您的链接问题,因为它告诉C++编译器 C 编译器也需要访问此函数,但C编译器不理解extern的这种用法。

如果你想解决它,你可以做这样的事情:

在头文件中:

#ifdef __cplusplus
extern "C"{
#endif
const char* nameOnly(const char* namewpath);
#ifdef __cplusplus
}
#endif

并在您的 .c 文件中:

const char* nameOnly(const char* namewpath)
{
    const char* res = namewpath + strlen(namewpath);
    while (res > namewpath) {
        const char* tmp = res - 1;
        if (*tmp == '/' || *tmp == '') break;
        --res;
    }
    return res;
}