相关疑难解决方法(0)

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

我需要一些关于编写跨平台代码的帮助; 不是应用程序,而是库.

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

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

如果没有,那么任何人都可以建议我在Windows上编译我的代码的最佳和最快的解决方案.我不需要在Linux下进行编译我很乐意直接在Windows下进行编译.此外,我正在使用两个外部库,它们是我在Windows和Linux系统上安装的boost和Xerces XML,所以希望它们不应该成为问题.

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

c++ cross-platform shared-libraries

26
推荐指数
3
解决办法
2万
查看次数

热插拔C++库可能吗?

我正在寻找"热插拔"C++代码库.我有兴趣让这项技术在Linux/Mac/Windows之间跨平台工作.基本上我想要主程序#include"StateMachine.h"来定义所有可调用接口.然后在运行时和DURING EXECUTION加载和卸载StateMachineLibrary.a以使我的应用程序使用不同的状态机.

我有一个想法可能是做一些事情,比如写一个包装器,将这个编译的代码加载到我自己的malloc内存中,并在该内存中创建函数指针?

动机是我的项目的状态机部分将经常更改并需要重新编译,也允许主应用程序继续运行,同时加载不同的状态机.我希望使用一个"热插拔"库来安装像Lua脚本这样的东西,因为有些担心,所以考虑到作为一种替代品已经被探索过了.

c++ cross-platform shared-libraries dynamic-linking

10
推荐指数
2
解决办法
4093
查看次数

COM的跨平台替代方案

我一直迷恋于基于组件的编程(无论是COM,另一个系统,还是只使用普通C++中的范例).它需要一点习惯,如果一个人习惯于"传统的"OOP模型,但它是值得的.它使我的代码更易于维护和扩展.

我目前正在研究的项目是使用范例,但没有设置系统.但是,我真的很想找到一些可以满足以下要求的系统.从我现在的状态切换到新系统需要花费一些时间,但是我稍后会节省多倍的时间.

要求:

  1. 跨平台
  2. 快速
  3. 适用于C++
  4. 支持跨进程编组

让我详细说明这些要求:

跨平台

基本上,我需要它在Windows和Mac上工作.Linux会很好,但绝不是必不可少的.此外,它确实需要满足所有平台的其他要求.有一个适用于Mac的COM,这将是理想的,但它不支持要求4.此外,它必须支持GCC和MSVC.

快速

不幸的是,这就是CORBA失败的地方,尽管它满足了其他三个要求.进程内方法调用需要尽可能快(理想情况下,如COM),因为某些例程也可能从音频中断调用.

适用于C++

......我想这一点大多是显而易见的.我不介意不使用C++类来实现组件,虽然这将定义有用,并且替代方案必须仍然易于使用,特别是因为最终我打算发布第三方扩展的API.

支持跨进程编组

我的意思是至少能够序列化呼叫.如果这是通过IDL生成的代码完成的,那对我来说完全没问题,而且我也不介意实现跨进程通信本身.

COM会很棒,但它不能完全满足要求1.CORBA也会很棒,但它不符合要求2(即使有最快的ORB).XPCOM可能不符合要求2,并且不适用于MSVC,因此不符合要求1.

有什么想法吗?我的下一步是使用protobufs或类似的东西来推销自己,但我当然希望避免这种情况.

更新

详细说明 - 在此上下文中的音频中断可以低至2-3ms.那个时间甚至不能完全提供给我,因为其他组件需要在那个时间处理,而我的软件本身就包含了另一个需要在那个时间处理的软件.这就是为什么在进程和跨进程编组都需要非常快的原因.

c c++ com cross-platform corba

9
推荐指数
1
解决办法
2297
查看次数

包装loadlibrary的C++类?

我想这将是很酷的几类环绕LoadLibraryGetProcAddress,LibraryFunction分别.在我考虑这个问题时,我不确定它是否可行.这是我在想的:

Library 类:

class Library
{
    HANDLE m_handle;
public:
    // Handles initializing the DLL:
    Library(std::string name);
    // Deinitializes the DLL
    ~Library();

    HANDLE getHandle();
    bool isInitialized();
}
Run Code Online (Sandbox Code Playgroud)

Function班级:

class Function
{
public:
    Function(Library& library, std::string name);


    void* call(/* varg arguments? */) throw(exception);

    bool isValid();
}
Run Code Online (Sandbox Code Playgroud)

出现问题是因为我必须为参数提供动态数据类型,并将多个长度传递给实际函数指针.我可以通过在构造函数中指定它来获取参数的多个长度,并且具有特定的方法但是数据类型呢?

编辑:我根据任何人在这里使用的答案创建了类:https://github.com/ic3man5/ice--

c++ loadlibrary

6
推荐指数
1
解决办法
2543
查看次数