从 C++ 中未解析的外部调用 C 函数
Unresolved external calling C function from C++
我有一个 Visual Studio 解决方案,它必须从 C++ 代码调用遗留 C 代码,但我遇到了链接器错误。例如:
1>------ Build started: Project: testapp_soln, Configuration: Debug Win32 ------
1>legacy.lib(launchit.obj) : error LNK2019: unresolved external symbol "void __cdecl legacy_task(void)" (?legacy_task@@YAXXZ) referenced in function "public: virtual void __thiscall Launchit::DoIt(void)" (?DoIt@Launchit@@UAEXXZ)
1>E:\share\code\so\TestApp\testapp_soln\Debug\testapp_soln.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我有一个名为 legacy 的静态库项目,使用 C++ class,launchit 调用遗留 C 代码中的 C 函数。
以下是遗留项目的详细信息。
legacy.h:
#ifndef LEGACY_H_
#define LEGACY_H_
extern void legacy_task (void);
extern int initialise_thing();
#endif /* LEGACY_H_ */
legacy.c
#include "legacy.h"
void legacy_task (void)
{
/* doing things */
initialise_thing();
}
legacy_init.c
#include <stdio.h>
int initialise_thing()
{
printf("Doing init thing here\n");
return 0;
}
从 launchit 调用的遗留 C 东西 class
launchit.hpp
#ifndef LAUNCHIT_HPP_
#define LAUNCHIT_HPP_
class Launchit
{
public:
Launchit();
virtual ~Launchit();
virtual void DoIt();
};
#endif // LAUNCHIT_HPP_
launchit.cpp
#include "Launchit.hpp"
#include "legacy.h"
Launchit::Launchit()
{
}
Launchit::~Launchit()
{
}
void Launchit::DoIt()
{
legacy_task();
}
然后我将其构建为静态库。它构建得很好。
我有一个这样的控制台应用程序项目:
#include "launchit.hpp"
int main() {
Launchit li;
li.DoIt();
}
但这给了我链接器错误:
legacy.lib(launchit.obj) : error LNK2019: unresolved external symbol "void __cdecl legacy_task(void)" (?legacy_task@@YAXXZ) referenced in function "public: virtual void __thiscall Launchit::DoIt(void)" (?DoIt@Launchit@@UAEXXZ)
如何修复此链接器错误?
请注意,link 错误表示未找到符号 ?legacy_task@@YAXXZ
。这是一个混合名称,由 C++ 编译器从函数名称派生而来。为了与 C 兼容,您需要在 legacy.h
:
中使用 "extern "C"
#ifdef __cplusplus
extern "C" {
#endif
void legacy_task (void);
#ifdef __cplusplus
}
#endif
这样,编译器就不会破坏函数的名称。
有关 extern "C"
的详细讨论,请参阅 In C++ source, what is the effect of extern "C"?
我有一个 Visual Studio 解决方案,它必须从 C++ 代码调用遗留 C 代码,但我遇到了链接器错误。例如:
1>------ Build started: Project: testapp_soln, Configuration: Debug Win32 ------
1>legacy.lib(launchit.obj) : error LNK2019: unresolved external symbol "void __cdecl legacy_task(void)" (?legacy_task@@YAXXZ) referenced in function "public: virtual void __thiscall Launchit::DoIt(void)" (?DoIt@Launchit@@UAEXXZ)
1>E:\share\code\so\TestApp\testapp_soln\Debug\testapp_soln.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我有一个名为 legacy 的静态库项目,使用 C++ class,launchit 调用遗留 C 代码中的 C 函数。
以下是遗留项目的详细信息。
legacy.h:
#ifndef LEGACY_H_
#define LEGACY_H_
extern void legacy_task (void);
extern int initialise_thing();
#endif /* LEGACY_H_ */
legacy.c
#include "legacy.h"
void legacy_task (void)
{
/* doing things */
initialise_thing();
}
legacy_init.c
#include <stdio.h>
int initialise_thing()
{
printf("Doing init thing here\n");
return 0;
}
从 launchit 调用的遗留 C 东西 class
launchit.hpp
#ifndef LAUNCHIT_HPP_
#define LAUNCHIT_HPP_
class Launchit
{
public:
Launchit();
virtual ~Launchit();
virtual void DoIt();
};
#endif // LAUNCHIT_HPP_
launchit.cpp
#include "Launchit.hpp"
#include "legacy.h"
Launchit::Launchit()
{
}
Launchit::~Launchit()
{
}
void Launchit::DoIt()
{
legacy_task();
}
然后我将其构建为静态库。它构建得很好。
我有一个这样的控制台应用程序项目:
#include "launchit.hpp"
int main() {
Launchit li;
li.DoIt();
}
但这给了我链接器错误:
legacy.lib(launchit.obj) : error LNK2019: unresolved external symbol "void __cdecl legacy_task(void)" (?legacy_task@@YAXXZ) referenced in function "public: virtual void __thiscall Launchit::DoIt(void)" (?DoIt@Launchit@@UAEXXZ)
如何修复此链接器错误?
请注意,link 错误表示未找到符号 ?legacy_task@@YAXXZ
。这是一个混合名称,由 C++ 编译器从函数名称派生而来。为了与 C 兼容,您需要在 legacy.h
:
#ifdef __cplusplus
extern "C" {
#endif
void legacy_task (void);
#ifdef __cplusplus
}
#endif
这样,编译器就不会破坏函数的名称。
有关 extern "C"
的详细讨论,请参阅 In C++ source, what is the effect of extern "C"?