我有 x.h 文件和 y.h 文件,z.c 文件。 z.c 包括 y.h,y.h 包括 x.h。 我有一个函数需要在 x.h 中声明并在 z.c 中定义,因为它需要使用 y.h 中的一些其他函数。
我尝试过这样
// x.h
int foo();
// y.h
#include "x.h"
// z.c
#include"y.h"
int foo() {
blah;
blah;
return 1;
}
这一切都在一个项目中,比如说在 x_y.dll 中,它编译得很好,我有 x_y.dll、x_y.lib
现在在其他项目a_b中 在 a.c 文件之一中,我尝试包含 x.h 并调用 foo(); 编译良好,但出现链接器错误 lnk2019 和 lnk1120 无法解析的外部符号
我正在使用 VS2008,我将路径设置为 x_y.lib 所在的文件夹。
最佳答案
创建一个宏,如下所示:
#ifndef DLL_IFACE
#ifdef DLL_IFACE_EXPORT
#define DLL_IFACE _declspec( dllexport )
#else // !DLL_IFACE_EXPORT
#define DLL_IFACE _declspec( dllimport )
#endif // !DLL_IFACE_EXPORT
#endif // !DLL_IFACE
并将其放入每个人都包含的 header 中。然后在x.h中:
DLL_IFACE int foo();
然后在 z.c 中,以以下方式启动该文件:
#define DLL_IFACE_EXPORT
当您构建定义该函数的 dll 时,这将导致该函数被声明为“_declspec( dllexport )”。并会导致该函数在其他 dll 中被声明为“_declspec( dllimport )”。
dllexport 告诉编译器给定的函数应该是 dll 公共(public)接口(interface)的一部分。它将函数放入 dll 的动态符号表中。 dllimport 告诉编译器稍后将通过动态链接导入该函数。
关于c++ - 调用头文件中声明的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11423174/