dll — библиотека C ++ для разных компиляторов

Я пишу библиотеку C ++, используя MinGW (4.8.0 dw2 posix). Эта библиотека используется в другом проекте C ++, в котором используется другой компилятор (в данном случае msvc).

Ссылаясь на этот Я перепроектировал мою библиотеку C ++. Есть две вещи, которые я не знаю, как я могу сделать:

  1. Могу ли я использовать пространства имен?
  2. Я заметил, что time_t на MinGW является 32-битным, а в msvc — 64-битным. Что я могу сделать?

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 определяется как unsigned long на MinGW и `__int64 ‘на msvc. Что я могу сделать?

2

Решение

Используйте мою библиотеку cppcomponents на https://github.com/jbandela/cppcomponents

Это было протестировано с Visual C ++ 2013 (в предыдущих версиях не хватало поддержки c ++ 11) и mingw gcc 4.7+ на Windows. Это библиотека только для заголовков, выпущенная по лицензии Boost. Это позволяет вам использовать функции c ++ 11, такие как std :: string, vector, tuple, pair, time_point для всех компиляторов. Я был бы рад ответить на любые ваши вопросы относительно того, как использовать его для вашего конкретного случая.

Вот пример для вашего случая

Сначала определите класс в 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector