创建DLL,与__declspec混淆(dllexport)

时间:2011-01-09 14:25:04

标签: visual-studio visual-c++

Visual Studio C++ 2005
Windows XP

我正在创建这个DLL库。 DLL实际上与另一个LIB链接。我已经包含了头文件和lib路径。一切都编好了。

实际上,这个代码我写的是在linux上运行,运行正常。现在我将它移植到Windows上运行。

但是,我注意到某些代码示例中的某些DLL在头文件中使用了这个:

static __declspec(dllexport) float some_function(int num1, int num2);

但是,我已经完成了以下示例代码,标题为* .h文件。但是,不确定我是否仍然需要上述内容?

#ifdef __cplusplus
extern "C" {
#endif

media_t* get_media(media_description_t* obj);
void* get_item(media_description_list_t *obj, int num);
int get_number_format(media_t *obj);
const char* get_media_value(media_t *obj);

#ifdef __cplusplus
}
#endif

实现* .cpp文件的示例代码

int get_number_format(media_t *obj)
{
    Media *med = (Media*)obj;
    return med->getNumFormat();
}

那么,我需要这个static __declspec(dllexport)吗?

非常感谢任何建议,

4 个答案:

答案 0 :(得分:4)

需要告诉链接器应该导出哪些函数,使其可以被其他使用DLL的代码使用。 __declspec(dllexport)执行此操作。但您也可以通过为链接器提供.def文件,导出的函数名列表来实现。有点痛苦,因为现在由你来保持该文件与你的代码同步。文档are here

答案 1 :(得分:2)

__declspec(dllexport)将函数添加到DLL的导出表中。此表是一种约定,允许希望使用DLL的进程正确调用该函数。

export functions from DLLs还有其他方法,但这个方法可能更现代,更容易使用。

答案 2 :(得分:1)

是的,如果您没有dllexport,则无法在您调用该函数的任何其他应用程序中访问该函数。

答案 3 :(得分:0)

如果将方法的实现放在h文件中,则不需要使用__declspec(dllexport)声明。