【发布时间】:2022-04-11 21:47:31
【问题描述】:
我想用 Visual Studio 编写一个 DLL,默认情况下所有教程或模板都包含 C++(.cpp 文件)。
如果我尝试创建一个没有预编译头文件的 DLL 项目,则生成的项目只有一个“dllmain.cpp”文件(根据 Microsoft 站点,这是可选的)。
所以我删除了文件“dllmain.cpp”,只是为了得到 MyDLL.c 和 MyDLL.h。所以我试图让一个项目尽可能纯粹:
- 删除包括“pch.h”、实用程序、limits.h
- 在声明我的原型之前删除包含中的 extern "C" 代码
所以最后,我的代码看起来像:
MyDLL.h:
#pragma once
#ifdef DLL_API
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
DLL_API void dll_init(void);
MyDLL.c:
#include "MyDLL.h"
#include <stdio.h>
void dll_init(void)
{
printf("------- Init DLL -------");
}
它可以编译,但我只收到警告:“警告 C4273:不一致的 DLL 链接”。
我可以通过强制修复错误:
"#define DLL_API __declspec(dllexport)"
真的可以只用 C 语言编写 DLL。或者在 C++ 中的使用是强制性的,它是使用 extern "C" 允许在 C 中包装。什么是哲学?
【问题讨论】:
-
绝对没有理由不能用 C 编写 DLL。但是
#ifdef DLL_API对我来说看起来不对,我会仔细检查一下。 -
绝对有可能。很多年前我就做过了,不幸的是我不能分享任何东西。
-
如果该库将从 C++ 中使用,则删除
extern "C"是有问题的 - 最好是有条件地(取消)激活它:#ifdef __cplusplus extern "C" { #endif /* declarations */ #ifdef __cplusplus } #endif。然后您的标头可用于 C++ 和 C。 -
除了 Paul 的评论:您可能需要在实现源代码中
#define DLL_API之前#include "MyDLL.h"。但是,宏的名称看起来不对,因为您需要在重新定义之前#undef。 -
纯技术上在这种情况下使用相同的符号名称是合法提供你
#undef它之前重新定义它(你不' t,虽然)。但是,如果 good practice 是另一个问题。在任何情况下,您都需要确保DLL_API确实已经在#including标头时定义。您可以通过 C 文件 before 中的#define执行此操作,包括头文件或通过文件或全局文件的编译器标志!
标签: c visual-studio dll