我试图从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;
}
我也尝试过包含这些功能,但我得到了同样的错误。我此刻真的迷失了并经常搜索过......任何帮助都会非常感激。
答案 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中的一个解决方案中同时拥有这两个项目
如果你有自己的解决方案中的每个项目
您的应用程序应该在没有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