#pragma comment如何导入指定文件夹的lib文件 + 导出函数命名规范的问题

cat210 2010-04-26 11:17:24
两个小问题:
1、#pragma comment如何导入指定文件夹里的lib文件。
我知道如果lib文件在应用程序主文件夹里,可以直接使用:#pragma comment(lib,"Dll.lib")。如果将lib文件拷入到主程序中新建的某一文件夹DLL1中,应该使用:#pragma comment(lib,"D:\\VC\\DLL1\\Dll.lib")。可如果把文件拷给别人,对方还得改文件的路径。
我想问的是:如果不列写出lib文件的全部路径,如何使用#pragma comment导入指定文件夹里的lib文件,这个文件夹是程序主文件夹里自己设的。(不通过project-setting进行设置)

2、导出函数命名规范的问题
我新建一个常规动态DLL,在里面新建了一个对话框资源,关联了一个类CTest,定义里一个函数void add(int a ,int b);
貌似常规动态DLL不能导出整个类,所以我用下面的方法把这个函数导出:
[code=C/C++][/

#ifndef DLL_API
#ifdef _WIN_DLLL
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllexport)

#endif
#endif

class CTest : public CDialog
{
public:
void DLL_API add(int a ,int b);
...
};]

结果调用失败了,说没有找到这个函数。我用Depends查看,发现导出函数的函数名是:?add@CTest@@QAEXHH@Z。想请问如何能将系统修改后的名字改回来呢?是在程序里添加什么指令或标识符吗?如果使用def文件,应该如何书写呢,能将书写的内容贴出来吗,谢谢!

就这两个问题,请大家赐教!
...全文
1398 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xi2ha2 2010-04-30
  • 打赏
  • 举报
回复
还是用def导出吧,如mcaok所写。extern "C"实在是不行啊
xi2ha2 2010-04-27
  • 打赏
  • 举报
回复
用extern "C"似乎不行啊,我也没试出来

#ifndef DLL_API
#ifdef _WIN_DLLL
#define DLL_API __declspec(dllexport)
#else
#define DLL_API extern "C" __declspec(dllexport)
#endif
#endif

class CTest : public CDialog
{
public:
void DLL_API add(int a ,int b);
}
但错误和楼上不同
error C2059: syntax error : 'string'
error C2238: unexpected token(s) preceding ';'
怎么回事啊?
cat210 2010-04-27
  • 打赏
  • 举报
回复
发现个问题,用extern "C"强制命名似乎只对一般的类起作用。我的这个类是基于对话框的类,如果使用extern "C",会出现下面两个错误:
error C2144: syntax error : missing ';' before type 'void'
error C2501: 'DLL_API' : missing storage-class or type specifiers
求详解
Eleven 2010-04-26
  • 打赏
  • 举报
回复
ls的已经都说过了,可行
wltg2001 2010-04-26
  • 打赏
  • 举报
回复
发现导出函数的函数名是:?add@CTest@@QAEXHH@Z。想请问如何能将系统修改后的名字改回来呢?
==========
这个可以用DEF文件,也可以在函数声明中用extern "C"强制用C方式定义函数名。

LIB文件的问题好像没有什么办法,那个并不是C/C++执行期间的问题,而是预编译的指令,动态改变文件夹位置好像没有什么办法。个人觉得,要不就用动态调用的方式,不用LIB文件,或者就将LIB文件放在工作文件夹中就行了。
mcaok 2010-04-26
  • 打赏
  • 举报
回复
Dll.def文件
LIBRARY Dll
EXPORTS
add

oyljerry 2010-04-26
  • 打赏
  • 举报
回复
导出函数修饰了,添加extern C方式
ljz888666555 2010-04-26
  • 打赏
  • 举报
回复
第一个问题,使用相对路径,
每二个就是用def文件,
尹成 2010-04-26
  • 打赏
  • 举报
回复
发现导出函数的函数名是:?add@CTest@@QAEXHH@Z。想请问如何能将系统修改后的名字改回来呢?
==========
这个可以用DEF文件,也可以在函数声明中用extern "C"强制用C方式定义函数名。

LIB文件的问题好像没有什么办法,那个并不是C/C++执行期间的问题,而是预编译的指令,动态改变文件夹位置好像没有什么办法。个人觉得,要不就用动态调用的方式,不用LIB文件,或者就将LIB文件放在工作文件夹中就行了。
cat210 2010-04-26
  • 打赏
  • 举报
回复
谢谢诸位的回答。第一个问题自己找到了解决方法。
比如程序所在的文件夹是D:\VC\DLL1\。如果我把lib文件放到工程文件夹中,想要调用它可以这样做:
#pragma comment(lib,"Dll1.lib")
如果在里面新建一个文件夹lib,将lib文件拷进去。在使用导入文件时除了列写出全路径:
#pragma comment(lib,"D:\\VC\\DLL1\\lib\\Dll1.lib")
还可以这样书写:
#pragma comment(lib,".\\lib\\Dll1.lib")
关键就在前面这个“.”上,它代表了当前目录,也就是代表了之前代码里的“D:\\VC\\DLL1”。用这种方法就可以找到工程文件夹中任意文件夹里的文件了。(注意,这里所指的文件夹一定是在工程文件夹中定义的,对任意路径的文件夹似乎就没有什么好办法了)。
发现这种方法是因为记起孙鑫在讲动态链接库时,提到了DLL的搜索顺序,其中就提到了“.”代表“当前目录”。

目前正在试验第二个问题,请大家多指教!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧