Unix平台上的C++程序员使用什么方法来创建和管理Makefile?
我在我的项目中使用手工制作的Makefile,但它们不处理头文件更改和其他依赖项.我google了一下,在这里找到了一个很好的解决方案.
但是我在sed命令中遇到了一个问题 -
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \
Run Code Online (Sandbox Code Playgroud)
问题在于第3个表达式"-e's/*\$$ //".它不起作用.它应该删除尾随反斜杠.我知道那里必须有双倍的美元,因为这是一个Makefile.有人能告诉我这里有什么问题吗?
这是完整的Makefile -
CC=g++
CFLAGS=-g -Wall
LIBS=-lpthread
OBJS=file1.o file2.o
TARGET=testProg
$(TARGET) : $(OBJS)
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
%.o : %.cpp
$(CC) -MMD -c -o $@ $< $(CFLAGS)
@cp $*.d $*.P; \
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $*.d >> …Run Code Online (Sandbox Code Playgroud) 我在假期周末学习了一点C,我开始研究用C编写的其他程序.我最后看了GNU Netcat,认为这将是一个很好的例子.
看到600线main()功能让我有点震惊.这是正常的吗?如果这是正常的,这被认为是良好的C编码实践吗?
这一切似乎都是一个巨大的混乱.
我想要的只是一个实现C++ 11的编译器,所以我可以使用<chrono>.但是我从一开始就很困惑.
目前,我通过调用G ++来构建程序,但是当我检查版本时$ g++ -v,我得到:
gcc版本4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.11.00)
这是怎么回事?我使用的是G ++吗?GCC?LLVM?我甚至不知道.它们是一样的吗?
所以现在我正在尝试通过gnu.org构建和下载GCC 4.7 ,但我不知道任何指南正在谈论什么.对于我不知道的事情,我从未见过这么多的首字母缩略词.
为什么这么复杂?什么是所有这些版本,其中一些只实现C++ 11的某些部分而不是其他部分?
简介:
我在类似unix的系统上使用GNU Make(3.81)而且我遇到了一个问题,即$(wildcard, pattern)函数无法找到由(可能/显然?)先前执行的配方生成的文件,而其他程序(例如ls)能够验证其存在.我想知道为什么通配符函数没有返回任何东西,当它被扩展(到空字符串),以及我如何获得它来查找生成的文件.
测试用例:
以下测试用例说明了问题.
Makefile内容:
.PHONY: build clean
test:
@echo "Creating test file 'test'."
@echo "this is a test file" > test
build: test
@echo "Directory contents:"
@ls
@echo "Test file contents:"
@cat test
@echo "Wildcard output:"
@echo $(wildcard test)
clean:
@rm -f test
Run Code Online (Sandbox Code Playgroud)
运行makefile两次(然后清理)显示只有在第二次运行时它才会检测到创建的文件.
输出:
Creating test file 'test'.
Directory contents:
makefile test
Test file contents:
this is a test file
Wildcard output:
Directory contents:
makefile test
Test file contents:
this is a test file
Wildcard …Run Code Online (Sandbox Code Playgroud) 我想有一些格式的less显示*.md降价文件 - 比如我知道less可以,对于联机帮助页等.我正在运行Ubuntu 12.04.
我将用户定义的过滤器放入.lessfilter:
#!/bin/sh
case "$1" in
*.md)
fn=/tmp/$1.$$.html
markdown "$1" | html2txt > $fn ### LOSES FORMATTING
cat $fn ### TO STDOUT???
;;
*)
# We don't handle this format
exit 1
esac
# No further processing by lesspipe necessary
exit 0
Run Code Online (Sandbox Code Playgroud)
所以,主要问题是:
less,而不是丢失它html2txt*.html文件磁盘并让它less在自己的题外话处理(看到html扩展并对其进行操作?)我想知道他们的表现/稳定性是否彼此不同,他们的许可证简短解释.真实世界的经历受到欢迎.
在GNU bash的手册告诉我
如果使用语法分配任何变量,则会自动创建索引数组
Run Code Online (Sandbox Code Playgroud)name[subscript]=value下标被视为必须求值为数字的算术表达式.如果下标求值为小于零的数字,则将其用作大于数组最大索引的偏移量的偏移量(因此-1的子标记指向数组的最后一个元素).
所以我想我会尝试一下,得到以下结果:
$ muh=(1 4 'a' 'bleh' 2)
$ echo $muh
1
$ echo ${muh[*]}
1 4 a bleh 2 # so far so good so now I'll try a negative ...
$ echo ${muh[-1]}
-bash: muh: bad array subscript # didn't go as planned!
Run Code Online (Sandbox Code Playgroud)
我做错了什么,或者网站是错误的,还是gnu bash与我在CentOS下运行的bash有什么不同?谢谢!
我有这三个文件:
$ cat pattern-ok
['\-]
$ cat pattern-buggy
[\-']
$ cat text
abc'def-ghi
Run Code Online (Sandbox Code Playgroud)
现在,以下是我不知道的错误或正则表达式功能?
$ cat text | grep -f pattern-ok
abc'def-ghi
$ cat text | grep -f pattern-buggy
grep: Invalid range end
Run Code Online (Sandbox Code Playgroud)
我正在使用:
$ grep --version | head -n 1
grep (GNU grep) 2.20
Run Code Online (Sandbox Code Playgroud) 所以我正在查看gcc编译器的来源,我在fork.c中看到了这个:
int
__fork ()
{
__set_errno (ENOSYS);
return -1;
}
libc_hidden_def (__fork)
stub_warning (fork)
weak_alias (__fork, fork)
#include <stub-tag.h>
Run Code Online (Sandbox Code Playgroud)
我想弄清楚weak_alias的作用.我在glibc源文件中使用了grep命令来查找所有出现的#define weak_alias:
grep -r "#define weak_alias"
Run Code Online (Sandbox Code Playgroud)
我发现很多次出现的宏:
#define weak_alias(n, a)
Run Code Online (Sandbox Code Playgroud)
但宏并没有真正解释任何事情.他们只是定义了这个陈述,但没有说明它是如何被替换的.例如,一个出现在profil.c中:
/* Turn off the attempt to generate ld aliasing records. */
#undef weak_alias
#define weak_alias(a,b)
Run Code Online (Sandbox Code Playgroud)
那么有什么想法,weak_alias做什么以及它在哪里定义?
提前致谢
在GNU Awk 的 4.1.2 Record Splitting with 中,gawk我们可以阅读:
当
RS是单个字符时,RT包含相同的单个字符。但是,whenRS是正则表达式,RT包含与正则表达式匹配的实际输入文本。
这个变量RT在某些情况下非常有用。
同样,我们可以设置一个正则表达式作为字段分隔符。例如,在这里我们允许它是“;” 或“|”:
$ gawk -F';' '{print NF}' <<< "hello;how|are you"
2 # there are 2 fields, since ";" appears once
$ gawk -F'[;|]' '{print NF}' <<< "hello;how|are you"
3 # there are 3 fields, since ";" appears once and "|" also once
Run Code Online (Sandbox Code Playgroud)
但是,如果我们想再次打包数据,我们没有办法知道两个字段之间出现了哪个分隔符。因此,如果在前面的示例中我想遍历字段并使用 再次将它们打印在一起FS,它会在每种情况下打印整个表达式:
$ gawk -F'[;|]' '{for (i=1;i<=NF;i++) printf ("%s%s", $i, FS)}' …Run Code Online (Sandbox Code Playgroud)