跨不同编译器的C ++库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跨不同编译器的C ++库相关的知识,希望对你有一定的参考价值。

我正在使用MinGW(4.8.0 dw2 posix)编写C ++库。该库用于另一个使用其他编译器的C ++项目(在本例中为msvc)。

参考qazxsw poi我重新设计了我的C ++库。有两件事我不知道怎么办:

  1. 我可以使用命名空间吗?
  2. 我注意到MinGW上的time_t是32位,而msvc中的time_t是64位。我能做什么?

1)

这是否打破了ABI:

this

2

我怎样才能确定基础类型在不同的编译器中是相同的。例如,在这种情况下,// 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); 在MinGW上定义为time_t,在msvc上定义为“__int64”。我能做什么?

答案

unsigned long使用我的库cppcomponents

这是使用Visual C ++ 2013(以前的版本没有足够的c ++ 11支持)和mingw gcc 4.7+在Windows上测试的。它是在boost许可下发布的仅头文件库。这允许您在编译器中使用诸如std :: string,vector,tuple,pair,time_point之类的c ++ 11功能。我很乐意回答您有关如何在特定情况下使用它的任何问题。

以下是您案例的示例

首先在Window.h中定义类

https://github.com/jbandela/cppcomponents

然后在WindowImp.cpp中实现该类

#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;

}

最后使用UseWindow.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()

以下是使用g ++构建库的方法

#include "Window.h"
#include <iostream>

int main(){
    mylib::Window w;
    w.setTitle("my title");
    std::cout << w.getTitle();
}

以下是使用MSVC 2013构建程序的方法

g++ WindowImp.cpp -std=c++11 -shared -o windowlibdll.dll -I SourceReposcppcomponents

如果你有cppcomponents,用路径替换cl UseWindow.cpp /EHsc /I SourceReposcppcomponents

确保生成的windowslibdll.dll和UseWindow.exe位于同一目录中并运行UseWindow.exe

以上是关于跨不同编译器的C ++库的主要内容,如果未能解决你的问题,请参考以下文章

如何制作可在不同代码库中重用的C“库”?

混合来自不同编译器的 C++ 代码

如何重用相同的 C 代码但使用不同的运算符

开发跨平台 C++11 代码 [关闭]

C 函数和作用域

C语言Linux下动态库和静态库详解