最近研究Amazon的aws-sdk-cpp,是开源的代码,至少要用VS2013进行编译,因为代码中用到了C++11的新语法。
用cmake生成了VS2017的工程,编译顺利的通过了。然后写了个简单的测试工程,能正确的编译和运行,可是调试时发现F11始终进不到dll的源码,而在dll源码里打上断点后,F5运行却能在dll源码断点处停下来。印象中之前也有遇到过,一直没有找出原因。今天花了一上午的时间来研究,终于发现了问题。
#if defined (USE_WINDOWS_DLL_SEMANTICS) || defined (WIN32)
#ifdef _MSC_VER
#pragma warning(disable : 4251)
#endif // _MSC_VER
#ifdef USE_IMPORT_EXPORT
#ifdef AWS_CORE_EXPORTS
#define AWS_CORE_API __declspec(dllexport)
#else // AWS_CORE_EXPORTS
#define AWS_CORE_API __declspec(dllimport)
#endif // AWS_CORE_EXPORTS
#else // USE_IMPORT_EXPORT
#define AWS_CORE_API
#endif // USE_IMPORT_EXPORT
#else // defined (USE_WINDOWS_DLL_SEMANTICS) || defined (WIN32)
#define AWS_CORE_API
#endif // defined (USE_WINDOWS_DLL_SEMANTICS) || defined (WIN32)
以上是aws-sdk-cpp定义的导入导出宏定义,aws-sdk定义了USE_WINDOWS_DLL_SEMANTICS、WIN32、USE_IMPORT_EXPORT和AWS_CORE_EXPORTS,这样宏AWS_CORE_API就被定义为__declspec(dllexport),表示从dll中导出相关符号。
而我写的测试工程,只定义了WIN32,最终宏AWS_CORE_API定义为空,在把aws-sdk头文件include后,相关函数的定义“AWS_CORE_API void InitAPI(const SDKOptions& options);”就变成了“void InitAPI(const SDKOptions& options);”,没有__declspec(dllimport),这样也能编译通过并且正确运行,但是F11就是进不到dll源码里面。以前的认知是要导入函数,必须加__declspec(dllimport),但是今天才发现,原来不用__declspec(dllimport)定义函数,也能成功。
然后我就在测试工程里加上了USE_IMPORT_EXPORT,编译调试,再F11就能进入到dll源码了。