混合 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 错误的主要内容,如果未能解决你的问题,请参考以下文章
LNK2019“未解析的外部符号”错误(C++ OpenGL)
C++ LNK1120 和 LNK2019 错误:“未解析的外部符号 WinMain@16”
Visual C++ 2017,外部“C”被忽略了吗?将 C++ 代码链接到 C 库时出现 LNK2019 错误