我正在使用MinGW(4.8.0 dw2 posix)编写C ++库。该库用于另一个使用其他编译器的C ++项目(在本例中为msvc)。
参考this我重新设计了我的C ++库。有两件事我不知道怎么办:
1)
这是否破坏了ABI:
// Window.h
// MYLIB_API defined as __declspec( dllexports )
// MYLIB_CALL defined as __stdcall
namespace mylib {
class Window {
public:
virtual void MYLIB_CALL destroy() = 0;
virtual void MYLIB_CALL setTitle(const char* title) = 0;
virtual const char* MYLIB_CALL getTitle() = 0;
void operator delete(void* p) {
if (p) {
Window* w = static_cast<Window*>(p);
w->destroy();
}
}
};
} // mylib
extern "C" MYLIB_API mylib::Window* MYLIB_CALL CreateWindow(const char* title);
2
我怎样才能确定基础类型在不同的编译器中是相同的。例如,在这种情况下,time_t
在MinGW上定义为unsigned long
,在msvc上定义为`__int64'。我该怎么办?
答案 0 :(得分:1)
在https://github.com/jbandela/cppcomponents
使用我的库cppcomponents使用Visual C ++ 2013(以前的版本没有足够的c ++ 11支持)和mingw gcc 4.7+在Windows上进行测试。它是在boost许可下发布的仅头文件库。这允许您在编译器中使用诸如std :: string,vector,tuple,pair,time_point之类的c ++ 11功能。我很乐意回答您有关如何在特定情况下使用它的任何问题。
以下是您案例的示例
首先在Window.h中定义类
#include <cppcomponents/cppcomponents.hpp>
namespace mylib{
struct IWindow :cppcomponents::define_interface<
cppcomponents::uuid<0x0d02ac9a, 0x4188, 0x48fc, 0x8054, 0xafe7252ec188 >>
{
std::string getTitle();
void setTitle(std::string new_title);
CPPCOMPONENTS_CONSTRUCT(IWindow, getTitle, setTitle);
};
inline std::string WindowID(){ return "windowlibdll!Window"; }
typedef cppcomponents::runtime_class<WindowID, cppcomponents::object_interfaces<IWindow>> Window_t;
typedef cppcomponents::use_runtime_class<Window_t> Window;
}
然后在WindowImp.cpp中实现该类
#include "Window.h"
struct ImplementWindow:cppcomponents::implement_runtime_class<ImplementWindow,mylib::Window_t>
{
std::string title_;
ImplementWindow(){}
std::string getTitle(){
return title_;
}
void setTitle(std::string new_title){
title_ = new_title;
}
};
CPPCOMPONENTS_DEFINE_FACTORY()
最后使用UseWindow.cpp中的代码
#include "Window.h"
#include <iostream>
int main(){
mylib::Window w;
w.setTitle("my title");
std::cout << w.getTitle();
}
以下是使用g ++
构建库的方法g++ WindowImp.cpp -std=c++11 -shared -o windowlibdll.dll -I Source\Repos\cppcomponents
以下是使用MSVC 2013构建程序的方法
cl UseWindow.cpp /EHsc /I Source\Repos\cppcomponents
将Source\Repose\cppcomponents
替换为您拥有cppcomponents的路径
确保生成的windowslibdll.dll和UseWindow.exe位于同一目录中并运行UseWindow.exe