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

Posted

技术标签:

【中文标题】混合 C 和 C++ 时继续出现 LNK2019 错误【英文标题】:Keep on getting LNK2019 error when mixing C and C++ 【发布时间】:2016-11-20 15:35:34 【问题描述】:

我正在尝试从 C++ 调用 C 代码。我有 3 个文件:pubsub.cpp、pubsublib.c 和 pubsublib.h。 我知道我必须使用 extern "C" 才能从 C++ 调用 C 函数。 我已经尝试了所有方法,但仍然收到以下 LNK2019 未解决的外部符号错误:

LNK2019 中引用的未解析外部符号 _thisIsATestFunction 函数_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;

我也尝试只包含这些功能,但我遇到了同样的错误。我现在真的很迷茫并且搜索了很多......任何帮助将不胜感激。

【问题讨论】:

发布错误。 LNK2019 未解析的外部符号 _thisIsATestFunction 在函数 _main 中引用 C++ 编译器可能会对原型void thisIsATestFunction(); 感到困惑,因为它表示它可以接受任意数量的参数,而 C++ 通常希望使用参数信息来装饰函数名称,以便能够解决模棱两可的调用.请尝试:void thisIsATestFunction(void); 我编辑了您的问题以添加错误信息。未来,我们需要知道的一切都应该在问题中,而不是 cmets。 我们仍然需要知道您是如何编译和链接这两个文件的(例如:您使用的确切命令) 【参考方案1】:

当您实际链接必要的文件时,它工作得非常好。

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

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

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

【讨论】:

我认为他正在使用不同的项目,因为如果它们来自单个项目,Visual C++ IDE 会自动将所有 obj 文件链接在一起。 @AndreasH.我也这么认为,这就是为什么我告诉他他必须确保 .obj 文件在链接输入中。【参考方案2】:

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

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

右键单击您的应用项目 从下拉菜单中选择“添加...” 从菜单中选择“参考” 检查列表中的库

如果每个项目都有自己的解决方案,那么

右键单击您的应用程序项目 选择“属性” 打开“链接器”部分的“输入”页面 将您的 .lib 文件添加到“附加依赖项”中

这样做后,您的应用程序应该在没有 LNK2019 的情况下编译。

还有“构建依赖项”需要管理,但这些不会影响链接到您的项目的库(仅影响构建顺序)。

(我使用的是德语版的 Visual Studio,所以如果有些翻译有误,请修正翻译)

【讨论】:

【参考方案3】:

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

现在有两种可能

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

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

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

【讨论】:

【参考方案4】:

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

更改设置后,确保“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

【讨论】:

他没有使用 gcc。

以上是关于混合 C 和 C++ 时继续出现 LNK2019 错误的主要内容,如果未能解决你的问题,请参考以下文章

“error LNK2019: 无法解析的外部符号”之分析

LNK2019“未解析的外部符号”错误(C++ OpenGL)

C++ LNK1120 和 LNK2019 错误:“未解析的外部符号 WinMain@16”

Visual C++ 2017,外部“C”被忽略了吗?将 C++ 代码链接到 C 库时出现 LNK2019 错误

使用 C++ Dll 的 LNK2019 构造函数/析构函数

LinkedList 实现 C++ 的编译器错误 LNK2019