0

以下代码会产生此错误:

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 文件,我正在用 Visual-C++ 编译它。使用 C 编译器编译时,我没有收到此错误。

更新:我尝试过使用extern

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

我得到这个错误:

error C2059: syntax error : 'string'
4

3 回答 3

2

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

当你说“这段代码是纯 C”时,如果声明被extern C { ... }包含在 C++ 实现文件中的头文件时被包围,那么它只是纯 C,否则名称修改会起作用,这就是我认为这个错误的原因.

于 2013-09-05T12:42:48.267 回答
2
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;
}
于 2013-09-05T12:49:47.437 回答
2

您需要使用一个头文件,该文件将函数标记为extern "c"将代码编译为 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"正确。

于 2013-09-05T12:47:07.320 回答