混合C和C ++时继续出现LNK2019错误

时间:2016-11-20 15:35:34

标签: c++ c visual-c++ lnk2019

我试图从C ++调用C代码。我有3个文件:pubsub.cpp,pubsublib.c& pubsublib.h。 我知道我必须使用extern" C"为了从C ++调用C函数。 我真的尝试了一切,但我仍然得到以下LNK2019未解决的外部符号错误:

  

LNK2019未解析的外部符号_thisIsATestFunction引用   function _main

pubsublib.c

#include "pubsublib.h"
void thisIsATestFunction()
{
    // do something
}

pubsublib.h

#ifndef pubsublib_H
#define pubsublib_H
void thisIsATestFunction();
#endif

pubsub.cpp

#include <string>
#include <iostream>

#ifdef __cplusplus
extern "C"{
#endif
    #include "pubsublib.h"
#ifdef __cplusplus
}
#endif

using namespace std;

int main() {
    thisIsATestFunction();
    return 0;
}

我也尝试过包含这些功能,但我得到了同样的错误。我此刻真的迷失了并经常搜索过......任何帮助都会非常感激。

4 个答案:

答案 0 :(得分:0)

当您实际链接到必要的文件时,它完全正常。

编译pubsub.cpp时,必须在命令行中添加pubsublib.obj。例如,这解决了我使用Visual Studio 2015的问题:

cl -c pubsublib.c
cl pubsub.cpp pubsublib.obj

如果您使用IDE进行构建,则只需确保pubsublib.c是一个依赖项,并将pubsublib.obj指定为链接步骤的输入。

答案 1 :(得分:0)

您必须在应用程序中添加对库的引用。

如果您在Visual C ++ 2015中的一个解决方案中同时拥有这两个项目

  • 右键单击您的应用程序项目
  • 选择&#34;添加...&#34;从下拉菜单
  • 选择&#34;参考&#34;从菜单
  • 检查列表中的库

如果你有自己的解决方案中的每个项目

  • 右键单击您的应用程序项目
  • 选择&#34;属性&#34;
  • open&#34; Linker&#34;部分&#34;输入&#34;页
  • 将您的.lib文件添加到&#34;其他依赖项&#34;

您的应用程序应该在没有LNK2019的情况下编译。

还有&#34;构建依赖关系&#34;管理,但这些不会影响链接到项目的库(仅构建顺序)。

(我正在使用德语版的Visual Studio,所以如果其中一些错误,请修改翻译)

答案 2 :(得分:0)

您的声明正常,因为证明错误消息(_thisIsATestFunction确实是C未修饰的名称)。

现在还有两种可能性

  • 文件pubsublib.c未编译为C,导致编译的函数被修饰;

  • 文件pubsublib.c编译为C,但未参与链接。

只有您的解决方案/项目文件可以说实话。我们能看到解决方案资源管理器的屏幕副本吗?

答案 3 :(得分:-1)

当“pubsublib.c”文件编译为C ++文件(以g ++格式)时,会产生此链接错误。请更改项目选项,以便使用g ++编译所有.cpp文件,并使用gcc编译所有.c文件。

更改设置后,请确保“pubsublib.c”文件确实是使用gcc编译的。它可以在编译输出中找到,如下所示:

g++.exe -c main.cpp -o main.o
gcc.exe -c pubsublib.c -o pubsublib.o 
g++.exe main.o pubsublib.o -o Project1.exe