【发布时间】:2013-12-22 18:14:33
【问题描述】:
我有一个 C 项目,我从中导出函数 f() 并从其他 C++ 项目中调用它,它工作正常。但是,当我在 f 中调用其他函数 g() 时,我得到 LNK2028 错误。
Cproject 的最小示例如下所示:
测试.h
#ifndef TEST_H
#define TEST_H
#include "myfunc.h"
#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)
EXTERN_DLL_EXPORT void f()
{
g(); // this will provide LNK2028 if f() is called from other project
}
#endif
myfunc.h
void g();
myfunc.c
#include "myfunc.h"
void g(){}
项目本身正在构建中。但是,当我从其他 C++/CLIproject 调用此函数时
#include "Test.h"
public ref class CppWrapper
{
public:
CppWrapper(){ f(); } // call external function
};
我得到错误:
error LNK2028: unresolved token (0A00007C) "void __cdecl g(void)" (?g@@$$FYAXXZ) referenced in function "extern "C" void __cdecl f(void)" (?f@@$$J0YAXXZ) main.obj CppWrapper
error LNK2019: unresolved external symbol "void __cdecl g(void)" (?g@@$$FYAXXZ) referenced in function "extern "C" void __cdecl f(void)" (?f@@$$J0YAXXZ) main.obj CppWrapper
其他细节:
- 我为整个解决方案设置了 x64 平台
- 在 CppWrapper 中,我包含来自 C 项目的
.lib文件
【问题讨论】:
-
尝试在另一个源文件中声明
f的主体而不是标题。这能解决您的问题吗? -
-
从源文件中删除
EXTERN_DLL_EXPORT。你只需要将它包含在头文件中。 -
@MaxTruxa 我没有将它包含在源文件中。在
Test.h我离开了EXTERN_DLL_EXPORT void f();。在Test.c我写#include "Test.h"和void f(){};它没有编译 (C2059)。 -
你必须在你的 CLR 项目中
__declspec(dllimport)你的函数。回家后我会为您制定解决方案。
标签: c++ visual-studio linker-errors dllexport