C++ C++;Linux和Windows的跨平台动态库

C++ C++;Linux和Windows的跨平台动态库,c++,cross-platform,shared-libraries,C++,Cross Platform,Shared Libraries,我想写一些跨平台的库代码 我正在创建一个静态库和动态库,大部分开发都是在Linux中完成的,我已经在Linux中生成了静态库和共享库,但现在想使用相同的源代码生成一个Windows版本的静态库和动态库,格式为.lib和.dll 这可能吗?我有点担心,因为我注意到在源代码中使用\u dllspec或类似的东西生成所需的Windows.dll文件 我正在寻找在Windows上编译代码的最佳和最快的解决方案。我不需要在Linux下编译;我很乐意直接在Windows下做这件事。我还使用了两个外部库,它们

我想写一些跨平台的库代码

我正在创建一个静态库和动态库,大部分开发都是在Linux中完成的,我已经在Linux中生成了静态库和共享库,但现在想使用相同的源代码生成一个Windows版本的静态库和动态库,格式为
.lib
.dll

这可能吗?我有点担心,因为我注意到在源代码中使用
\u dllspec
或类似的东西生成所需的Windows
.dll
文件

我正在寻找在Windows上编译代码的最佳和最快的解决方案。我不需要在Linux下编译;我很乐意直接在Windows下做这件事。我还使用了两个外部库,它们是Boost和Xerces XML,我已经在Windows和Linux系统上安装了这两个库,希望它们不会成为问题


我真正想要的是有一个可以在Linux和Windows下编译的源代码副本,以生成特定于每个平台的库。只要我有一个源代码副本,我就不在乎是否需要编辑支持Windows或Linux的代码。

一般来说,有两个问题需要关注:

  • 要求在Windows上,DLL显式导出对外部可见的符号(通过
    \uuu declspec(dllexport)
    ,以及
  • < LI>能够维护构建系统(理想地,不必维护单独的MaFe文件和微软Visual C++项目/解决方案) 首先,您需要了解
    \u declspec(dllexport)
    。在仅限Windows的项目上,这通常按照我在对的回答中所述的方式实现。您可以通过确保导出符号(如my\u PROJECT\u API)进一步扩展此功能已定义,但在为Linux构建时扩展为空。这样,您可以根据Windows的需要将导出符号添加到代码中,而不会影响Linux构建

    第二,您可以研究某种跨平台构建系统

    如果您对GNU工具集感到满意,您可能希望进行调查(可能与automake和autoconf一起进行)。 这些工具在Linux上本机支持,在Windows上通过或支持。MinGW还为您提供了交叉编译选项,即在运行Linux时构建本机Windows二进制文件。我发现有两个资源对自动工具(包括libtool)的导航很有帮助(特别是关于)和


    正如其他人所提到的,也是一个选项,但我自己不能说。

    您可以很容易地使用#ifdef实现。在Windows上,WIN32应该由编译器定义(即使是64位),因此

    #ifdef _WIN32
    #  define EXPORTIT __declspec( dllexport )
    #else
    #  define EXPORTIT
    #endif
    
    EXPORTIT int somefunction();
    

    应该适合你。

    如果你添加外部“C”!!,

    /*文件CMakeLists.txt*/

     SET (LIB_TYPE SHARED)
     ADD_LIBRARY(MyLibrary ${LIB_TYPE} MyLibrary.h)
    
    /*文件MyLibrary.h*/

    #if defined(_WIN32) || defined(__WIN32__)
    #  if defined(MyLibrary_EXPORTS) // add by CMake 
    #    define  MYLIB_EXPORT extern "C" __declspec(dllexport)
    #  else
    #    define  MYLIB_EXPORT extern "C" __declspec(dllimport)
    #  endif // MyLibrary_EXPORTS
    #elif defined(linux) || defined(__linux)
    # define MYLIB_EXPORT
    #endif
    
    MYLIB_EXPORT inline int Function(int a) {
        return a;
    }
    

    交叉编译通常是指在一个平台上构建要在另一个平台上运行的软件。既然你说你想要在Linux和Windows上都可以编译的源代码,那么你的问题实际上更多的是编写一个可移植的、跨平台的源代码库,而不是交叉编译。GIYF实际上,在这种情况下,libtool是你的朋友…当你等待答案的时候,看看CMake:我很高兴交叉编译或可移植代码也能做到这一点。当然交叉编译会很理想,因为它可以节省我的时间,但正如我说的,我无法选择哪一个是最好的或最简单的。另外,使用code::blocks IDE怎么样?我听说他们共享了l库模板及其在linux和windows中可用,有人知道这是否符合我的要求吗?谢谢,我做了一些谷歌搜索,我猜我搜索了错误的东西,libtool听起来很有趣,也许像上面提到的一样。我对linux有点陌生,所以这个工具不会很快响个铃:pSe usi Boost puoi usare Boost/config.hh che definisce le macro per esportare i simboli in maniera appropriata per tutti compiletori e piattaformehmm是的,我考虑过了,我会看看会怎样,如果我对上述问题没有把握,我可能会将此作为我的最后手段tools@iQ:即使使用上述工具,您仍必须执行此操作。它们无法处理导出f或者你,他们只是隐藏了不同平台上构建过程之间的一些差异。是的,我猜你是对的,我将不得不使用宏。我目前正在尝试研究代码块,我认为它可以自动为你定义一个.def文件,尽管我不知道这有多好或坏。我将不得不进行一些实验@tstenner你的意思是说,当人们在输入代码的过程中动态地创建自己的格式样式时,你不仅仅是绝对喜欢这种情况?:)