在我的Makefile中调用GREP的两种方式有什么不同吗?任何理由我应该使用其中一个?两者似乎都产生了相同的结果.
define GREP
$(word 3,$(shell echo "#define FOO 0xfff00100"))
endef
all:
@echo $(GREP)
@echo $(call GREP)
Run Code Online (Sandbox Code Playgroud) 我想在C中做一个自定义哈希表实现.在GNU库中是否已经有一个MD5/SHA1哈希函数,或者我是否必须使用外部库?
这是我正在寻找的东西:
int hashValue;
hashValue = MD5_HASH(valToHash);
Run Code Online (Sandbox Code Playgroud) 我的C库有一些可选功能,使用automake,用户可以通过提供配置标志来打开和关闭它们.
如果关闭某个功能,则不会编译该功能.
但是,我的问题是,在这种情况下,我是否应该从公共头文件中删除函数原型?
这似乎不是一个好主意,有未编译函数的函数原型,但它也对我来说不是一个好主意,有不同的公共报头装取决于库配置.(类似于config.h在公共头文件目录中安装的不良做法.)
对于可选功能,公共标题的最佳方法是什么?如果用户尝试使用禁用的功能,错误应该在编译时还是链接时?这种情况必须有标准做法.(如果有多个想法,我更愿意遵守GNU编码标准,但我不知道关于这个问题的GNU标准.)
我正在尝试安装roccc 2.0.我已经安装了所需的包.现在安装它时,它给了我这个错误:
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我搜索gnu/stubs-32.h并了解了,对于Linux 64位进程glibc-devel以及对于Linux 32位,其中libc6-dev-i386.
我使用的是Linux 32位:i386 GNU/Linux,但lib无法解决此错误.
有人可以帮帮我吗?
我正在尝试编译测试文件:
gcc -o test test.c -lg2c
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
/usr/bin/ld: cannot find -lg2c
Run Code Online (Sandbox Code Playgroud)
如果我使用:
gcc -o test test.c -L/usr/lib/gcc/x86_64-redhat-linux/3.4.6 -lg2c
Run Code Online (Sandbox Code Playgroud)
然后它工作正常.
所以我添加了这样的路径:
LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/3.4.6:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
当我在那里使用$LD_LIBRARY_PATH它时,但是:
gcc -o test test.c -lg2c
Run Code Online (Sandbox Code Playgroud)
仍然不起作用,它给出了同样的错误,我无法弄清楚为什么.
我正在使用CentOS(2.6.32-279.9.1.el6.x86_64),任何帮助将不胜感激.
编辑:编译器版本:
rpm -qa | grep gcc
gcc-4.4.6-4.el6.x86_64
compat-gcc-34-g77-3.4.6-19.el6.x86_64
libgcc-4.4.6-4.el6.x86_64
compat-gcc-34-3.4.6-19.el6.x86_64
gcc-gfortran-4.4.6-4.el6.x86_64
libgcc-4.4.6-4.el6.i686
gcc-c++-4.4.6-4.el6.x86_64
Run Code Online (Sandbox Code Playgroud)
编辑:我尝试使用LIBRARY_PATH,现在我得到一个不同的错误:
gcc: spec failure: unrecognized spec option 'M'
Run Code Online (Sandbox Code Playgroud)
我不知道这意味着什么.
假设我有两个文件,en.csv并且sp.csv,每个都包含正好两个逗号分隔的记录:
en.csv:
1,dog,red,car
3,cat,white,boat
Run Code Online (Sandbox Code Playgroud)
sp.csv:
2,conejo,gris,tren
3,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)
如果我执行
join -t, -a 1 -a 2 -e MISSING en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
1,dog,red,car
2,conejo,gris,tren
3,cat,white,boat,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)
请注意,所有缺少的字段都已折叠.要获得"正确的"全外连接,我需要指定一种格式; 从而
join -t, -a 1 -a 2 -e MISSING -o 0,1.2,1.3,1.4,2.2,2.3,2.4 en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)
产量
1,dog,red,car,MISSING,MISSING,MISSING
2,MISSING,MISSING,MISSING,conejo,gris,tren
3,cat,white,boat,gato,blanco,bote
Run Code Online (Sandbox Code Playgroud)
这种方式产生完全外连接的一个缺点是一个需要明确指定了决赛桌,这可能不容易编程的应用(如连接表的身份只有在运行时是已知的)做的格式.
最近版本的GNU join通过支持特殊格式消除了这个缺点auto.因此,join上面的最后一个命令的这种版本可以被更普遍的替换
join -t, -a 1 -a 2 -e MISSING -o auto en.csv sp.csv
Run Code Online (Sandbox Code Playgroud)
如何join在不支持该-o auto选项的版本中实现同样的效果?
背景和细节
我有一个Unix shell(zsh)脚本,用于处理多个CSV平面文件,并通过广泛使用GNU join的'-o auto'选项来实现.我需要修改这个脚本,以便它可以在可用 …
这确实是我的一个愚蠢的特质,但我不能忍受GNU AS用来插入评论的方式.我太熟悉Sun方式(在大多数UNIX汇编程序中使用的方法),它使用简单的斜杠"/"来注释掉代码直到行尾.
你知道如何实现我的小心血来潮吗?
我的问题是更好地理解我在制作过程中错过的内容和.SECONDARY目的与.PRECIOUS,而不是让我的脚本工作,因为它确实有效.
我正在使用make来打开文件上的emacs编辑器(java但与此问题无关)或者如果不存在则使用模板创建它.
如果它适用于现有文件,则在使用生成的文件时,最后会将其删除.
我在.SECONDARY中添加了先决条件但没有帮助,我不得不将其添加到.PRECIOUS中.
这就是为什么不在它工作的问题.SECONDARY?.
从我在SO上找到的 .SECONDARY不能用于模式(%),但即使知道它是否是设计或是否是make中的错误.(.SECONDARY用于GNU Make和Makefile模式规则的模式规则要么忽略虚假规则,要么自发删除输出文件)
这里是我的Makefile的精简内容,以重现我的问题(请创建一个com/stackoverflow/question目录来测试它).
PACKAGE=com.stackoverflow.question
PACKAGE_DIR=$(subst .,/,$(PACKAGE))
OUT=out
clean:
find $(OUT) -name "*.class" -type f -print0|xargs -0 rm
# does not work : deleted at end due to intermediate file removal.
$(PACKAGE_DIR)/%.java:
@echo "package com.stackoverflow.question;\npublic class $(subst .java,,$(subst $(PACKAGE_DIR)/,,$@))\n{\n /** TODO */ \n}" >$@
work/%: $(PACKAGE_DIR)/$(subst work/,,%).java
emacs $<
.PHONY: clean work/%
# tried to avoid intermediate file removal : does not work
.SECONDARY: $(PACKAGE_DIR)/%.java
# …Run Code Online (Sandbox Code Playgroud) 我读老的glibc的文档在这里时,我看到了,我以前从来没有(r_alloc,r_alloc_free和r_re_alloc)看到三个怪功能.他们实现了一个分配器,它可以为碎片整理目的重新分配内存,我想,但我无法在其他任何地方找到更多信息.
你能告诉我更多关于这些功能的信息吗?他们还在格里布吗?如果没有,为什么他们被删除?
说我想要echo一些东西并在变量中捕获它,同时我在屏幕上看到它.
echo "hello" | tee tmp_file
var=$(< tmp_file)
Run Code Online (Sandbox Code Playgroud)
所以现在我可以hello在终端中看到并将其保存到变量中$var.
但是,有没有办法在不使用临时文件的情况下执行此操作?tee似乎不是解决方案,因为它说(从man tee)读取标准输入并写入标准输出和文件,而这里它是标准输出的两倍.
如果这很重要,我在Bash 4.3中.