我喜欢GNU readline库,但由于它是GPL许可证,我不能将它用于商业软件.你知道其他选择吗?我只需要命令行历史记录和自动完成(客户关键字和文件)功能.我找到了这个链接:
http://github.com/antirez/linenoise
这似乎是一个很好的起点,但没有自动完成.
任何建议,当然这对于构建交互式shell命令的人来说必定是一项常见任务.
更新:
乌普忘了一个重要的细节,它也应该在Windows上运行..
我知道你不应该将打印与printf,cout和wprintf,wcout混合,但很难找到一个好的答案为什么以及是否有可能绕过它.问题是我使用一个外部库,用printf打印,我自己使用wcout.如果我做一个简单的例子它工作正常,但从我的完整应用程序它只是不打印printf语句.如果这确实是一个限制,那么会有许多库无法与广泛的打印应用程序一起工作.对此的任何见解都非常受欢迎.
更新:
我把它归结为:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <readline/readline.h>
#include <readline/history.h>
int main()
{
char *buf;
std::wcout << std::endl; /* ADDING THIS LINE MAKES PRINTF VANISH!!! */
rl_bind_key('\t',rl_abort);//disable auto-complete
while((buf = readline("my-command : "))!=NULL)
{
if (strcmp(buf,"quit")==0)
break;
std::wcout<<buf<< std::endl;
if (buf[0]!=0)
add_history(buf);
}
free(buf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我想这可能是一个冲动的问题,但它看起来仍然很奇怪,我必须检查它.
更新 - >解决方法:
首先,wprintf出现同样的问题.但我发现添加:
std::ios::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)
实际上做了诀窍......(注意错误而不是我所期望的那样......),唯一困扰我的是,我不明白为什么以及如何弄明白:-(
我试图在OSX 10.9 64位上静态链接libc ++
这是我做的:
1)通过修改libc ++源附带的脚本"buildit",构建一个带有fPIC的libc ++ 64.a.
2)使用fPIC构建我自己的所有源,并将我自己的include路径添加到新的libc ++源包含目录,同时使用-nostdinc ++作为编译标志.
3)链接"../build/libc++64.a"
我确信它会获取静态库,但它仍然会给我一个错误:
ld: illegal text-relocation to '__ZTVSt9bad_alloc' in /usr/lib/libc++.dylib from '__ZN3slm15ReadProblemFileERNS_5ModelERNS_3LogEPKwb' in bin/clang-darwin-4.2.1/release/address-model-64/threading-multi/read.o for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么以及它如何定位和使用 /usr/lib/libc++.dylib
更新:
当我在同一台机器上为32位执行相同的交叉构建时,构建成功,但我仍然依赖于libc ++.来自otool -L的dylib输出:
bin/clang-darwin-4.2.1/release/address-model-32/threading-multi/libsulum20.dynlib: libsulum20.dynlib (compatibility version 0.0.0, current version 0.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
Run Code Online (Sandbox Code Playgroud) 我有一个代码段,它很简单:
for( int i = 0; i < n; ++i)
{
if( data[i] > c && data[i] < r )
{
--data[i];
}
}
Run Code Online (Sandbox Code Playgroud)
它是大型功能和项目的一部分.这实际上是对不同循环的重写,这被证明是耗时的(长循环),但我对两件事感到惊讶:
当data [i]临时存储时,如下所示:
for( int i = 0; i < n; ++i)
{
const int tmp = data[i];
if( tmp > c && tmp < r )
{
--data[i];
}
}
Run Code Online (Sandbox Code Playgroud)
它变得更慢.我并不认为这应该更快,但我不明白为什么它应该这么慢,编译器应该能够弄清楚是否应该使用tmp.
但更重要的是,当我将代码段移动到一个单独的函数时,它变得慢了四倍.我想了解发生了什么,所以我查看了opt报告,在这两种情况下,循环都是矢量化的,似乎做了同样的优化.
所以我的问题是什么可以在一个不被称为百万次的函数上产生这样的差异,但它本身是耗时的?在opt报告中要查找什么?
我可以通过保持内联来避免它,但是为什么要烦我.
更新:
我应该强调,我的主要关注点是要理解,为什么它变得更慢,当移动到一个单独的功能.使用tmp变量给出的代码示例只是我在此过程中遇到的一个奇怪示例.