c++ DLL隐式加载
1.概要1.1 代码1.1.1 dll侧pch.h// pch.h: 这是预编译标头文件。// 下方列出的文件仅编译一次,提高了将来生成的生成性能。// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。#ifndef PCH_H
1.概要
1.1 代码
1.1.1 dll侧
pch.h
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#endif //PCH_H
pch.app
#include "pch.h"
__declspec(dllexport) int add(int a, int b)
{
return (a + b);
}
dllmain.cpp
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
3.
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
//隐式加载dll
#pragma comment(lib, "Dll8显隐加载.lib")
//声明外部函数
extern int add(int a, int b);
int main()
{
std::cout << "Hello World!\n";
int c = add(1,2);
std::cout<<c << "\n";
}
3. 运行结果
4.注意要点
4.1
错 extern "C" __declspec(dllexport) int add(int a, int b)
对__declspec(dllexport) int add(int a, int b)
4.2
xxx.lib 和xxx.dll 放在工程目录下,而不是debug中。
思考
1 extern "C" 为什么不行?
简单回答:因为隐式加载默认用的是c++的规则,而c++规则的函数名是带参数类型的,而c不带,所以加extern "C",就会导致函数找不到。(用 add_int_int 找 add就找不到)
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。
2.xxx.lib 和xxx.dll 放在debug中为什么不行?。
更多推荐
所有评论(0)