This question already has answers here:
What is an undefined reference/unresolved external symbol error and how do I fix it?

(34个答案)


4年前关闭。




我有一个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 ==========

我有一个名为librit的静态lib项目,带有C++类,launchit在Legacy 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东西

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)

如何解决此链接器错误?

最佳答案

请注意,链接错误表明未找到符号?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"?

09-07 03:34