【发布时间】:2014-07-10 07:43:45
【问题描述】:
我一直想知道__declspec(dllimport) 的真正用例是什么。我知道构建共享库需要使用__declspec(dllexport) 导出其符号,然后库的用户将这些符号用作__declspec(dllimport)。
然后,您应该使用启用dllexport 的特殊定义来构建共享库,如果未设置标志,则符号定义为dllimport。
但是,我从来没有使用过dllimport,它确实有效。
我有两个项目:
导入导出
有一个使用 EXPORTING 定义构建的小型 Util 类
Util.h:
#ifndef _UTIL_H_
#define _UTIL_H_
#if defined(EXPORTING)
# define EXPORT __declspec(dllexport)
#else
# define EXPORT // I should use __declspec(dllimport) but client will try out
#endif
class EXPORT Util {
public:
static void test();
};
#endif // !_UTIL_H_
然后在源文件Util.cpp中:
#include <iostream>
#include "Util.h"
void Util::test()
{
std::cout << "Testing..." << std::endl;
}
没有什么复杂的,正如你所看到的,当用户使用这个文件时,根本不会定义EXPORT(应该定义为dllimport)。
客户端 exe
Main.cpp:
#include <Util.h>
int main(void)
{
Util::test();
return 0;
}
链接到 ImportExport.lib 没有任何定义集,正常工作。没有未定义的引用。
我想知道为什么是dllimport的用例?它存在是为了向后兼容吗?
注意:所有代码都在 VisualStudio 2012 Express 上测试过。
【问题讨论】:
-
示例:为您的 c# 应用程序制作一个 opencl 包装器 2.0。
-
blogs.msdn.com/b/oldnewthing/archive/2006/07/27/680250.aspx,至少从“调用导入的函数,天真的方式”开始
标签: c++ visual-c++ linker