小编Sha*_*baz的帖子

Makefile - 为文件夹中的每个.c创建一个可执行文件

我的问题看似简单,但我已经失去了几个小时的学习试图找到解决方案.我正在尝试创建一个Makefile,为目录中的每个.c文件构建可执行文件.

我尝试过以下方法:

CC = gcc
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c,%.o,$(SRCS))

all: $(OBJS)
$(CC) $< -o $@

%.o: %.c
    $(CC) $(CPFLAGS)  -c  $<
Run Code Online (Sandbox Code Playgroud)

但这样它只创建.o文件,而不是任何可执行文件.我需要一个规则,为每个.o文件生成一个可执行文件.类似于以下内容:

gcc src.o -o src
Run Code Online (Sandbox Code Playgroud)

c makefile

8
推荐指数
1
解决办法
2220
查看次数

如何将密码回显为星号

我试图弄清楚如何提示输入密码,并将用户输入回显为星号(********)

最近,我开始创建一个可以连接到使用Python中的套接字模块的远程服务器的项目.它还没有完成,因为我正在使控制台用于连接服务器.

我正在尝试创建一个登录窗口,提示用户输入用户名和密码,但输入密码时我正在寻找要打印的星号,就像常见的密码输入一样(即 - Sekr3t被回复为:******).

经过几天的研究,我差不多完成了仍然有一个最后的错误,让我疯了(我完全无法解决它).注意 - 我知道有一个getpass模块可以用来替换它,更容易,但没有回声不是我正在寻找的.

这是我到目前为止的密码登录代码,我无法弄清楚为什么它不会回响星号:

import msvcrt
import sys

def login(prompt = '> '):
   write = sys.stdout.write

   for x in prompt:
       msvcrt.putch(x)
   passw = ""

   while 1:
       x = msvcrt.getch()
       if x == '\r' or x == '\n':
           break
       if x == '\b':
           # position of my error
           passw = passw[:-1]
       else:
           write('*')
           passw = passw + x
   msvcrt.putch('\r')
   msvcrt.putch('\n')
   return passw
Run Code Online (Sandbox Code Playgroud)

>

如果您通过代码阅读和/或通过IDLE之类的内容运行它,您可能会注意到当用户后退空间时,存储的数据被一个字符擦除,但打印的星号不是.ie - Sekr3t + backspace = Sekr3,但是******留下了回音.任何关于如何在输入退格时擦除最后一个星号的帮助将不胜感激.另请注意,很多此代码来自getpass模块.我知道这不是一个很好的解释,可能不是那么好的代码,但我还在学习 - 请耐心等待.

python passwords msvcrt getch echo

8
推荐指数
1
解决办法
9371
查看次数

如果从ViM调用`make`,如何在Makefile中知道?

简而言之,我需要在Makefile中知道是否从ViM调用了make.是否存在某个变量(例如环境或其他),ViM将设置为特定值?

我需要这个的原因如下:

如果从bash调用,我可以为用户(或我自己)做各种精彩的事情,例如给出关于正在构建哪个子系统的消息并突出显示错误和警告.

然而问题是,当从ViM调用时,错误消息已经被捕获并且引入\x1b命令(用于颜色)使得消息对ViM来说是不可理解的.我想要做的是:make在ViM中发布时基本上禁用着色.

虽然我宁愿让Makefile解决它,但我对其他解决方案持开放态度.

vim makefile

8
推荐指数
1
解决办法
217
查看次数

如果存储库处于冲突阶段,如何询问git?

作为一个人,有很多方法可以看到存储库是否存在需要解决的冲突.

但是,我正在寻找一种方法来在脚本中检查这一点.也就是说,检查存储库是否处于良好状态以开始对其执行某些操作,或者它处于用户必须修复冲突的阶段.

我可以想到以下方式:

__git_ps1 "%s" | grep MERGING > /dev/null 2>&1 && echo "In merge state"
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这不是推荐的方法.首先是因为作为C程序员__git_ps1开始__并且作为C程序员我倾向于认为它不适合我的使用,其次我猜测有更合适的方式:

git repo-status --is-merging
Run Code Online (Sandbox Code Playgroud)

哪个会有返回值,或类似的东西.

那么,如果存储库处于合并状态,我如何询问git(作为脚本)?

git state status

8
推荐指数
1
解决办法
3174
查看次数

编译器是否会通过将循环中的条件语句移动来优化循环中的条件语句?

这是C代码:

struct node{
    void *value;
    struct node *next;
};

void g(void *p){
    /*...*/
}

void f(struct node *head, const int ok){
    struct node *p=head;

    while (p){
        /* ...
           code 1 
           ...
         */
        if (ok!=0){
            g(p->value);
        }
        p=p->next;
    }
}
Run Code Online (Sandbox Code Playgroud)

我用gcc来编译这段代码.如果我编译-O,它会优化这样的功能f:

void f(struct node *head, const int ok){
    struct node *p=head;

    if (ok!=0){
        while (p){
            /* ...
               code 1 
               ...
             */
            g(p->value);
            p=p->next;
        }
    }
    else{
        while (p){
            /* ...
               code 1 
               ...
             */
            p=p->next;
        }
    } …
Run Code Online (Sandbox Code Playgroud)

c optimization gcc

8
推荐指数
1
解决办法
1905
查看次数

正确导出Linux标头,模块

在树中构建内核驱动程序时,我在drivers目录中运行make,这里KERNELDIR是内核源代码的路径,或者是头文件.

make -C $(KERNELDIR) M=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

在尝试使用以下方法构建标头时:

make headers_install ARCH=i386 INSTALL_HDR_PATH=$(HEADERSDIR)
Run Code Online (Sandbox Code Playgroud)

我觉得不适合出口建立一个反模块(不完整的内核源代码树)的几个文件和文件夹似乎丢失,就像一个Makefile文件,脚本,include/generated/autoconf.hinclude/config/auto.conf

Debian以一种可用的方式处理事务,如rules.real中所描述的那样,尽管它的描述不仅仅是描述的Documentation/make/headers_install.txt,似乎不是"标准"方式.

简而言之:我如何正确导出linux头文件,以便我可以针对它构建外部模块?

linux kernel module header

7
推荐指数
2
解决办法
4718
查看次数

树的分治算法

我正在尝试为树木编写一个分而治之的算法.对于除法步骤,我需要一种算法,通过移除节点将给定的无向图G =(V,E)与n个节点和m个边分割成子树.所有子图应具有不包含超过n/2个节点的属性(树应尽可能分割).首先,我尝试以递归方式从树中删除所有叶子以找到最后剩余的节点,然后我尝试在G中找到最长的路径并删除它的中间节点.下面给出的图表显示两种方法都不起作用:

图形

是否有一些工作算法可以满足我的需要(在上述情况下返回节点H).

algorithm graph-theory divide-and-conquer graph-algorithm

7
推荐指数
1
解决办法
3747
查看次数

递归应用operator->

据说箭头运算符是递归应用的.但是,当我尝试执行以下代码时,它会在打印4时打印出乱码.

class dummy
{
public:
    int *p;

    int operator->()
    {
        return 4;
    }
};

class screen 
{
public:
    dummy *p;

    screen(dummy *pp): p(pp){}
    dummy* operator->()
    {
        return p;
    }
};

int main()
{
    dummy *d = new dummy;
    screen s(d);
    cout<<s->p;
    delete d;
}
Run Code Online (Sandbox Code Playgroud)

c++

7
推荐指数
1
解决办法
2076
查看次数

是否可以在一次操作中应用两个匹配的模式转换?

我有一个填充了文件名和路径的bash变量:

SONG="~/Music/Mine/Cool Title Bro.flac"
Run Code Online (Sandbox Code Playgroud)

在我尝试使标记变得更加容易的过程中,我对变量应用了一些转换以隔离标题:

echo "${SONG#\~/Music/Mine/}" # which prints: Cool Title Bro.flac
Run Code Online (Sandbox Code Playgroud)

我知道也可以删除后缀${SONG%%.flac}.

但是,是否可以在单个操作中删除前缀和后缀?

这个:

${SONG#\~/Music/Mine/%%.flac}
Run Code Online (Sandbox Code Playgroud)

大概是因为它试图将文字%%.flac作为前缀的一部分进行匹配.反过来不起作用(%%.flac#~/[...]),我甚至疯了似试

${${SONG#~/Music/Mine/}%%.flac}
Run Code Online (Sandbox Code Playgroud)

这也行不通.

这可能是我工程过度工程的一个主要例子,但是如果有办法做到这一点并且我还没有弄清楚它会很好.

bash shell

7
推荐指数
1
解决办法
130
查看次数

vim:为拆分窗口设置不同的状态行

当我打开2个水平分割文件时,每个窗口都有自己的状态行.

例如用命令

vim -o a.txt b.txt
Run Code Online (Sandbox Code Playgroud)

我将获得第一个窗口的状态行为"a.txt",第二个窗口为"b.txt".

我需要从命令行调用vim,我需要设置一个自定义状态行,并且我希望每个窗口都有不同的状态行.

vim -o -c "set statusline=hello" a.txt b.txt
Run Code Online (Sandbox Code Playgroud)

我得到"你好"作为两个窗口的状态.

如何将"hello"作为第一个窗口的状态行,将"world"作为第二个窗口,我该怎么做; 从命令行调用vim时?

此命令不起作用:

vim -o -c "set statusline=hello" a.txt -c "set statusline=world" b.txt
Run Code Online (Sandbox Code Playgroud)

请帮忙.

vim

7
推荐指数
1
解决办法
1373
查看次数