Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Unix程序控制台与其他东西_C++ - Fatal编程技术网

C++ Unix程序控制台与其他东西

C++ Unix程序控制台与其他东西,c++,C++,我正在用unix编写一个程序。目前,它有一个控制台界面。我只是好奇,就像windows中的dll一样,当另一个程序想要调用您的程序时,unix中是否存在类似的概念。我被要求只提供一个二进制文件,在细节方面几乎没有其他内容。我有一种感觉,可能有另一个程序称之为这个。所以如果我这样做,我需要做什么?我无法共享源代码。我只能提供一个已编译的二进制文件(我对此也有点困惑…当我们在unix中谈论二进制文件时,这意味着一些是可执行的,而另一些不是。在我的程序中,我假设他们要求的是可执行的,至少在我得到确认之

我正在用unix编写一个程序。目前,它有一个控制台界面。我只是好奇,就像windows中的dll一样,当另一个程序想要调用您的程序时,unix中是否存在类似的概念。我被要求只提供一个二进制文件,在细节方面几乎没有其他内容。我有一种感觉,可能有另一个程序称之为这个。所以如果我这样做,我需要做什么?我无法共享源代码。我只能提供一个已编译的二进制文件(我对此也有点困惑…当我们在unix中谈论二进制文件时,这意味着一些是可执行的,而另一些不是。在我的程序中,我假设他们要求的是可执行的,至少在我得到确认之前是这样)。我是否需要做一些特殊的事情,比如像DLL那样提供api?我只是不确定这一切在unix中是如何实现的。

是的。在Linux中,它们被称为“共享对象”(so),在Mac OS X中,它们被称为“动态库”(dylib)和“捆绑包”(bundle)

例如,请参见如何创建*.so文件


(如果您不想重新组织到库中,另一个程序也可以通过
popen
使用您的控制台界面。)

在大多数(当前)版本的Unix上,相当于DLL的是一个共享对象文件(*.so)

将您的程序打包为一个独立的可执行文件,通过管道与其他程序协作是完全可行的——事实上,这是典型的Unix程序协作模式


只需确保您的程序支持各种“命令行标志”,以确保另一个希望通过管道提供服务的程序可以有效地使用它。一个最重要且经常被遗忘的标志是确保程序的I/O是无缓冲的(因此“调用程序”不会被迫玩pty把戏)。仔细区分stdout和stderr也有帮助!此外,如果在正常操作中,您的程序以任何方式“装饰”输出以使其适合人类消费(提示、解释等),请确保通过标志可以轻松获得“简单的、事实的”输出,这是其他程序所需要的。

共享对象需要调用实体知道的符号(-也就是说,SO/DLL的插件api)导出。DLL有这个,所以有这个——这可能就是你们所说的api

Windows为函数和变量提供了限定符,这些限定符确保符号在DLL中可见。GCC也必须具有这些限定符


以下是有关的文档链接。

与Windows dll相当的unix是一个共享库,例如
libfoobar.so

关于如何以二进制形式将代码分发给第三方,您可以选择:

  • 静态库:
    libfoobar.a
  • 共享/动态库:
    libfoobar.so
  • 可执行文件
  • 前两种情况实际上是一样的。现在人们倾向于使用动态库,因为库代码可以由多个可执行文件共享,从而使可执行文件的大小和所需的内存量都更小

    在这两种情况下,代码的用户都必须编写代码才能使用API,并且他们需要根据您的库编译代码


    在第三种情况下,您将向第三方提供他们运行的可执行文件。他们将通过某种进程间通信机制(如管道或共享内存)或通过网络(如UDP或TCP作为低级机制)调用您的应用程序,或通过某种RPC机制(如SunRPC、SOAP、HTTP、REST)调用您的应用程序,您有哪些.

    我使用getline作为我的输出方式(缓冲)。我有一个菜单,他们可以按1生成代码(结果是代码)或者2验证返回有效或无效的代码。我以前从未真正弄乱过未缓冲的输出,也不确定其后果。例如,这将如何改变getline的功能…可能它将不再getline,从我的理解来看,它被缓冲的全部原因是优化。是的,缓冲为了优化目的,当stdout连接到管道时,这是C运行时库的默认值——因此,只要有一个命令行标志,要求您执行
    setbuf(stdout,0)
    一开始,使用程序可以很容易地让您在产生反效果时击败优化,而不是强迫它使用
    expect
    或其他基于pty的技巧(这绝对是反优化)。一点也不难!而且绝对提供了该菜单的另一种选择,也可以根据需要选择并通过命令行开关。是的,他们特别要求提供一个bin。因此,这肯定是一个可执行文件。问题是,我也将制作一个windows版本,它肯定是dll驱动的,因此我将为此提供一个静态库可能是在vs2008中。但这是一个很酷的信息。我想我会找到一个关于如何在unix上创建静态库的教程,并学习如何在unix上创建静态库,这只是为了我自己的学习。谢谢你的帮助。