__declspec( dllimport )和__declspec( dllexport )

fangchao918628 2013-11-08 10:36:03
别人写的一个String类,我在我的项目中引用这个头文件,debug 模式下,弹出 应用程序配置不正确,调了很久,没点思路,哪位大侠遇到过这样的问题!万分感谢
#ifndef __String_h__
#define __String_h__

#include "XXXXXExport.h"
#include "XXXXXHeader.h"

namespace XXXXXCore
{
class String;

typedef std::list<String> StringList;
typedef StringList::iterator StringListIter;

typedef std::vector<String> StringVector;
typedef StringVector::iterator StringVectorIter;

typedef std::map<String,String> MapString;
typedef MapString::iterator MapStringIter;

class _XXXXXXExport String
{
public:
String(){}
String(std::string str):m_str(str){}
String(char * str):m_str(str){}
String(const char * str):m_str(str){}
String(const String &str):m_str(str.m_str){}
virtual ~String(){}
std::string str()const{ return m_str;}
bool empty()const{ return m_str.empty();}
long size(){ return m_str.size();}
std::string &str_ref(){ return m_str;}
void to_upper(){ boost::algorithm::to_upper(m_str);}
void to_lower(){ boost::algorithm::to_lower(m_str);}
void trim(){ boost::algorithm::trim(m_str);}
bool starts_with(const String &value){ return boost::algorithm::starts_with(m_str,value.m_str);}
bool ends_with(const String &value){ return boost::algorithm::ends_with(m_str,value.m_str);}
bool equals(const String &value){ return boost::algorithm::equals(m_str,value.m_str);}
StringVector split(String &separator);
bool contains(const String &value){ return boost::contains(m_str,value.m_str);}
bool operator==(const String &value)const { return value.m_str == m_str;}
bool operator!=(const String &value)const { return value.m_str != m_str;}
String operator+(const String &value)const { std::string temp = m_str; temp+= value.m_str;return temp;}
String &operator+=(const String &value){ m_str += value.m_str;return *this;}
bool operator<(const String &value)const { return m_str < value.m_str;}
protected:
std::string m_str;
};

static const String BLANK;
}
#endif



#ifndef __XXXXXXExport_h__
#define __XXXXXXExport_h__

#include "XXXXXHeader.h"

#if defined XXXXXCore_EXPORTS
# define _XXXXXCoreExport __declspec( dllexport )
#else
# define _XXXXXXCoreExport __declspec( dllimport )
#endif

class _XXXXXExport boost::noncopyable_::noncopyable;

#endif

...全文
304 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
许文君 2013-11-11
  • 打赏
  • 举报
回复
引用 19 楼 fangchao918628 的回复:
发现,我用的VS2008 打开清单工具,发现它还依赖2005的运行时库! 后来把是否嵌入清单工具改成否....就O了
那就是运行时链接不一致引起的,和我15L所述相同
fangchao918628 2013-11-11
  • 打赏
  • 举报
回复
发现,我用的VS2008 打开清单工具,发现它还依赖2005的运行时库! 后来把是否嵌入清单工具改成否....就O了
mrlgy 2013-11-08
  • 打赏
  • 举报
回复
可能你没加库吧,
  • 打赏
  • 举报
回复
引用 17 楼 akirya 的回复:
[quote=引用 14 楼 fangchao918628 的回复:] [quote=引用 13 楼 akirya 的回复:] 最好的办法是 拿源码到工程中编译 再其次编译成静态库,静态库编译选项同exe。 只能用dll的话,那就将dll和exe的 运行库选项都该为动态连接。(不一定解决问题)
你说的是将MDD 改成 MTD么,库文件一改这选项,就报N个错误出来!说Base_string在CRT_XXX.dll中已经定义 都改成MDD又 出现上述我说的错误! 为了编译成功纠结了很久[/quote] /MDd 或 /MT /MT或MTd 的话出错是没办法解决的[/quote] 更正下 ,应为 /MDd 或 /MD
  • 打赏
  • 举报
回复
引用 14 楼 fangchao918628 的回复:
[quote=引用 13 楼 akirya 的回复:] 最好的办法是 拿源码到工程中编译 再其次编译成静态库,静态库编译选项同exe。 只能用dll的话,那就将dll和exe的 运行库选项都该为动态连接。(不一定解决问题)
你说的是将MDD 改成 MTD么,库文件一改这选项,就报N个错误出来!说Base_string在CRT_XXX.dll中已经定义 都改成MDD又 出现上述我说的错误! 为了编译成功纠结了很久[/quote] /MDd 或 /MT /MT或MTd 的话出错是没办法解决的
过客_匆匆 2013-11-08
  • 打赏
  • 举报
回复
我猜别人的工程里面肯定是这样写的 #define XXXXXCore_EXPORTS; #if defined XXXXXCore_EXPORTS # define _XXXXXCoreExport __declspec( dllexport ) #else # define _XXXXXXCoreExport __declspec( dllimport ) #endif 这样的话在他工程里面 _XXXXXCoreExport 实际上就是 __declspec( dllexport ) 而 你工程中不会定义 XXXXXCore_EXPORTS的 所以你直接拿来用就行了 别做什么define定义 因为你没有定义XXXXXCore_EXPORTS, 那么预编译的时候 _XXXXXXCoreExport就是__declspec( dllimport )这个, 表示导入了 同时你要保证把lib文件加到工程中了 和 using namespace了
许文君 2013-11-08
  • 打赏
  • 举报
回复
引用 14 楼 fangchao918628 的回复:
[quote=引用 13 楼 akirya 的回复:] 最好的办法是 拿源码到工程中编译 再其次编译成静态库,静态库编译选项同exe。 只能用dll的话,那就将dll和exe的 运行库选项都该为动态连接。(不一定解决问题)
你说的是将MDD 改成 MTD么,库文件一改这选项,就报N个错误出来!说Base_string在CRT_XXX.dll中已经定义 都改成MDD又 出现上述我说的错误! 为了编译成功纠结了很久[/quote] 这个看上去像是运行时不一致,是否debug和release的crt都链接了
fangchao918628 2013-11-08
  • 打赏
  • 举报
回复
引用 13 楼 akirya 的回复:
最好的办法是 拿源码到工程中编译 再其次编译成静态库,静态库编译选项同exe。 只能用dll的话,那就将dll和exe的 运行库选项都该为动态连接。(不一定解决问题)
你说的是将MDD 改成 MTD么,库文件一改这选项,就报N个错误出来!说Base_string在CRT_XXX.dll中已经定义 都改成MDD又 出现上述我说的错误! 为了编译成功纠结了很久
  • 打赏
  • 举报
回复
最好的办法是 拿源码到工程中编译 再其次编译成静态库,静态库编译选项同exe。 只能用dll的话,那就将dll和exe的 运行库选项都该为动态连接。(不一定解决问题)
fangchao918628 2013-11-08
  • 打赏
  • 举报
回复
没用到头文件中声明的东西,就一个空的main函数
许文君 2013-11-08
  • 打赏
  • 举报
回复
引用 9 楼 fangchao918628 的回复:
[quote=引用 8 楼 xuddk727 的回复:] 很明显调用不一致,txt打开.lib文件看看
这个要看什么地方,能具体说下么,谢谢!!
引用 3 楼 worldy 的回复:
那看看能不能满足你的要求咯,能满足就行,呵呵
现在改了没用! 这个库是别人写的,我一直找了N+头文件,找到这......[/quote] 看错了,以为你编译阶段报错。 depends打开exe,profile下看看能否定位问题所在
worldy 2013-11-08
  • 打赏
  • 举报
回复
那个类使用了命名空间,你include之后有没有使用 Using namespace?
fangchao918628 2013-11-08
  • 打赏
  • 举报
回复
引用 8 楼 xuddk727 的回复:
很明显调用不一致,txt打开.lib文件看看
这个要看什么地方,能具体说下么,谢谢!!
引用 3 楼 worldy 的回复:
那看看能不能满足你的要求咯,能满足就行,呵呵
现在改了没用! 这个库是别人写的,我一直找了N+头文件,找到这......
许文君 2013-11-08
  • 打赏
  • 举报
回复
很明显调用不一致,txt打开.lib文件看看
worldy 2013-11-08
  • 打赏
  • 举报
回复
引用 5 楼 fangchao918628 的回复:
第一段代码是个头文件,我是引用这个包含这个头文件的.h 文件,然后爆出这个错误,然后跟踪到这个头文件!如果去掉这个头文件就没问题! [quote=引用 3 楼 worldy 的回复:] 在你include它之前,加上#undef XXXXXCore_EXPORTS 试试?
#define  XXXXCore_EXPORTS
倒是不会报错![/quote] 那看看能不能满足你的要求咯,能满足就行,呵呵
fangchao918628 2013-11-08
  • 打赏
  • 举报
回复
以前也遇见过这个问题,将MDd 改成MTd好了一段时间,突然之间又报了,完全的不知所以然
fangchao918628 2013-11-08
  • 打赏
  • 举报
回复
第一段代码是个头文件,我是引用这个包含这个头文件的.h 文件,然后爆出这个错误,然后跟踪到这个头文件!如果去掉这个头文件就没问题!
引用 3 楼 worldy 的回复:
在你include它之前,加上#undef XXXXXCore_EXPORTS 试试?
#define  XXXXCore_EXPORTS
倒是不会报错!
lgstudyvc 2013-11-08
  • 打赏
  • 举报
回复
加载库用, 你怎么加载的?
worldy 2013-11-08
  • 打赏
  • 举报
回复
在你include它之前,加上#undef XXXXXCore_EXPORTS 试试?
worldy 2013-11-08
  • 打赏
  • 举报
回复
The dllexport and dllimport storage-class attributes are Microsoft-specific extensions to the C and C++ languages. They enable you to export and import functions, data, and objects to and from a DLL. These attributes explicitly define the DLL’s interface to its client, which can be the executable file or another DLL. Declaring functions as dllexport eliminates the need for a module-definition (.DEF) file, at least with respect to the specification of exported functions. Note that dllexport replaces the __export keyword. 你这个是用别人的,应该是将其作为输入库开看待,应该让__declspec( dllimport ) 起作用,(那个宏也定义的怪别扭的了)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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