有没有办法在Visual Studio中自动生成DLL的DEF文件?我以前总是手动创建它们,但是必须有一个更简单的方法.
我创建了一个包含类"myCppClass"的C++ Dll项目,并尝试使用以下代码将其导出:如下所述:http://msdn.microsoft.com/en-us/library/a90k134d( v = vs. 80)的.aspx
class __declspec(dllexport) CExampleExport : //public CObject
{ ... class definition ... };
Run Code Online (Sandbox Code Playgroud)
我省略了"public CObject",因为它需要afx.h并暗示它是一个MFC Dll.我不确定这是否是好事但它与DLL项目默认设置不同.
从上面链接的文档中我可以相信所有"公共函数和成员变量"都可以导入.我如何在C#中实现这一目标?可以简单地实例化该类吗?
编辑:我刚刚意识到帖子的标题可能会产生误导.重点应放在C#的DllImporting上,并确保我在C++中正确地遵循了文档
http://msdn.microsoft.com/en-us/library/9h658af8.aspx
MSDN说我可以从库中导出函数__declspec(dllexport)但是如何在我的可执行文件中加载这个库?
我在DLL中有一个导出的函数:
__declspec(dllexport) void myfunc(){}
Run Code Online (Sandbox Code Playgroud)
现在我想在我的可执行文件中使用它:
__declspec(dllimport) void myfunc(void);
Run Code Online (Sandbox Code Playgroud)
但是我的程序将如何知道在哪里找到这个功能?
在我的DLL中有一个我想要导出的方法.
//作品:
extern "C" __declspec(dllexport)
Run Code Online (Sandbox Code Playgroud)
//不会工作
__declspec(dllexport)
Run Code Online (Sandbox Code Playgroud)
C++导出:
extern "C" __declspec(dllexport) int Test();
Run Code Online (Sandbox Code Playgroud)
C#import:
[DllImport("CircleGPU2_32.DLL", EntryPoint = "Test",
CallingConvention = CallingConvention.StdCall)]
public static extern int Test();
Run Code Online (Sandbox Code Playgroud)
为什么我需要外部"C"?
我在MS-Office DLL中窥探了一下,我发现有些DLL没有任何导出功能.我不太明白,应用程序如何在没有导出任何功能的情况下使用这些DLL?
我的意思是,dllmain()确实在LoadLibrary()上执行,但最重要的是什么?为什么有人会创建没有导出函数的DLL?
谢谢!:-)
DLL导出标题
extern "C"
void _declspec(dllexport) __stdcall foo();
Run Code Online (Sandbox Code Playgroud)
.def文件
EXPORTS
foo @1
Run Code Online (Sandbox Code Playgroud)
当我通过64位构建配置构建dll时,我遇到了这个警告.
警告LNK4197:多次指定导出'foo'; 使用第一个规范
但是,如果我通过32位构建配置构建dll,则警告永远不会发生.
问题是什么?有什么不同.
在接口的dll头文件中,我们通常使用这个技术,
#ifdef EXPORT_DLL
#define BASICAPI _declspec(dllexport)
#else
#define BASICAPI _declspec(dllimport)
#endif //_EXPORT_DLL
Run Code Online (Sandbox Code Playgroud)
但是如果def文件也存在,我们总是会在构建64位dll时遇到警告.
那么,我们应该写这样的代码吗?
#ifdef EXPORT_DLL
#define BASICAPI
#else
#define BASICAPI _declspec(dllimport)
#endif //_EXPORT_DLL
Run Code Online (Sandbox Code Playgroud)
它运作良好.但这对我来说并不熟悉.
给我你的意见.
我有一个名为"SimObject"的类:
namespace simBase
{
class __declspec(dllexport) SimObject: public SimSomething
{
public:
template <class T>
void updateParamValue( const std::string& name, T val );
}
}
Run Code Online (Sandbox Code Playgroud)
我有另一个名为"ITerrainDrawable"的类:
namespace simTerrain
{
class __declspec(dllexport) ITerrainDrawable : public simBase::SimObject
{
}
}
Run Code Online (Sandbox Code Playgroud)
这些类位于不同的库中.SimObject在simBase中,ITerrainDrawable在simTerrain库中.即使ITerrainDrawable派生自SimObject并且我包含了simBase库,我也会收到链接错误:
未解决的外部符号
1>ITerrainDrawable.obj : error LNK2019: unresolved external symbol "public: void __thiscall simBase::SimObject::updateParamValue<float>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,float)" (??$updateParamValue@M@SimObject@simBase@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@M@Z) referenced in function "public: void __thiscall simTerrain::ITerrainDrawable::setTerrainSize(float)" (?setTerrainSize@ITerrainDrawable@simTerrain@@QAEXM@Z)
1>ITerrainDrawable.obj : error LNK2019: unresolved external symbol "public: void __thiscall simBase::SimObject::updateParamValue<class osg::Vec4f>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> …Run Code Online (Sandbox Code Playgroud) 如果我有两个图书馆,A.lib和B.lib,这两个出口foo和bar,我怎么知道使用符号链接foo从A.lib和符号bar的B.lib?
如何使用单个函数将任意动态链接库(dll)函数加载到std::function对象中?
例如,我想将两个函数编译成一个dll:
// test.dll
int plusFive(int value) {
return value + 5;
}
void printHello() {
std::cout << "Hello!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
并在运行时使用以下单个函数加载它们:
// main.cc
#include <functional>
int main() {
std::function<int(int)> func1(loadDllFunc("test.dll", "plusFive"));
std::function<void()> func2(loadDllFunc("test.dll", "printHello"));
}
Run Code Online (Sandbox Code Playgroud) 我来自C#/ Java背景,所以我试图弄清楚如何创建一个行为类似于C#dll的C++ DLL.
我曾尝试用__declspec(dllexport)和__declspec(dllimport),但我只设法得到它的静态方法的工作.我确信这是由于我的理解有限.
如何在C++中导出类(完整地包括私有成员)并能够像引用C#一样在引用端实例化它们?一些指向在线资源/教程的指针也会这样做.
我开始使用MFC DLL模板,老实说,我不知道它们中有90%是什么,为什么我继承CWinApp.我试图标记该类,CCppPracticeLibraryApp但它将不再编译.
// CppPracticeLibrary.h : main header file for the CppPracticeLibrary DLL
//
#pragma once
#ifndef __AFXWIN_H__
#error "include 'stdafx.h' before including this file for PCH"
#endif
#include "resource.h" // main symbols
#ifdef CCppPracticeLibraryApp_EXPORTS
#define CCppPracticeLibraryApp_API __declspec(dllexport)
#else
#define CCppPracticeLibraryApp_API __declspec(dllimport)
#endif
// CCppPracticeLibraryApp
// See CppPracticeLibrary.cpp for the implementation of this class
//
class CCppPracticeLibraryApp : public CWinApp
{
public:
CCppPracticeLibraryApp();
static CCppPracticeLibraryApp_API void SayHelloWorld();
// Overrides
public: …Run Code Online (Sandbox Code Playgroud)