在Python中,当我运行此代码时:
from sys import argv
script, user_name =argv
prompt = '>'
print "Hi %s, I'm the %s script." % (user_name, script)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Traceback (most recent call last):
script, user_name =argv
ValueError: need more than 1 value to unpack
Run Code Online (Sandbox Code Playgroud)
这个错误意味着什么?
虽然两个名字都可以完成这项工作,但是makefile的正确名称是什么?
GNU`make'主页使用Makefile,我想这是命名它的好方法.在大写字母中键入前M的任何原因?
我想知道是否可以编写一个包含多个规则的Makefile,每个规则都定义了自己的先决条件,并在不重复配方的情况下执行所有相同的配方.例:
TARGETS= file1 file2 file3
all: $(TARGETS)
file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
cat $^ > $@
Run Code Online (Sandbox Code Playgroud)
谢谢!
给定以冒号分隔的路径列表,使用GNU Make获取以空格分隔的列表非常简单:
CPATHS := /usr/bin/foo:/usr/bin/baz:/usr/bin/baz
SPATHS := $(subst :, ,$(CPATHS))
Run Code Online (Sandbox Code Playgroud)
但是,我找不到朝着相反方向前进的好方法.以下hack确实有效(至少在安装了sed的情况下)但是我很确定只有使用Make的内部函数才能有更好的解决方法.
SPATHS := /usr/bin/foo /usr/bin/baz /usr/bin/baz
CPATHS := $(shell echo $(SPATHS) > tmp; sed 's/ \+/:/g' tmp; rm tmp)
Run Code Online (Sandbox Code Playgroud) 我正在学习如何使用list.h中的内核链表API .
我了解到我需要list_for_each_safe()在删除节点时使用list_del()而不是使用list_for_each().
代码list_for_each_safe():
#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)
Run Code Online (Sandbox Code Playgroud)
代码list_for_each():
for (pos = (head)->next; pos != (head); pos = pos->next)
Run Code Online (Sandbox Code Playgroud)
我注意到它们都非常相似,只是_safe版本需要额外的参数用作"临时存储"(在此声明为list.h).
我知道什么时候应用函数correcly,_safe版本删除,正常版本访问,但我很好奇额外的论点如何使它"安全"?
请考虑以下内容,我将删除链接列表中的每个节点list_for_each_safe():
struct kool_list{
int to;
struct list_head list;
int from;
};
struct kool_list *tmp;
struct list_head *pos, *q;
struct kool_list mylist; …Run Code Online (Sandbox Code Playgroud) 我在Windows上使用带有Eclipse的cygwin的Android NDK.在我的makefile中,我想在eclipse中使用环境变量设置prebuild库的路径.所以我做了以下事情:

在makefile中:
LOCAL_SRC_FILES = $(QCAR_SDK_ROOT)build/lib/$(TARGET_ARCH_ABI)/libQCAR.so
LOCAL_EXPORT_C_INCLUDES := $(QCAR_SDK_ROOT)build/include
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
Android NDK: ERROR:jni/Android.mk:QCAR-prebuilt: LOCAL_SRC_FILES points to a missing file
/cygdrive/d/Development/Android/android-ndk-r7/build/core/prebuilt-library.mk:43: *** Android NDK: Aborting . Stop.
make: *** [all] Error 2
Android NDK: Check that jni//cygdrive/D/Development/Android/qcar-android-1-5-4-beta1/build/lib/armeabi/libQCAR.so exists or that its path is correct
Run Code Online (Sandbox Code Playgroud)
直接尝试在makefile中定义变量,得到了相同的结果.
显然,这条道路不是我想要的.如何设置正确的路径?
我想在类创建时自动运行一些可以调用其他类方法的代码.我没有在类声明本身中找到这样做的方法,并最终创建一个@classmethod被调用__clsinit__并在类声明后立即从定义范围调用它.是否有一个我可以定义的方法,以便在创建类对象后自动调用它?
我有一个启动Django Web服务器的Makefile.我希望服务器在后台启动,PID保存到文件中.
我的食谱看起来像这样:
run: venv
@"${PYTHON}" "${APP}/manage.py" runserver 80
Run Code Online (Sandbox Code Playgroud)
直观地说,要构建进程并捕获PID,我必须做这样的事情:
run: venv
@"${PYTHON}" "${APP}/manage.py" runserver 80 & ; echo "$$!" > "${LOGDIR}/django.pid"
Run Code Online (Sandbox Code Playgroud)
但这不起作用.使用时,'make'使用的子shell(在我的情况下是/ bin/sh)可以正常工作:
<command> &
Run Code Online (Sandbox Code Playgroud)
...后台进程,并在使用时工作:
<command> ; <command>
Run Code Online (Sandbox Code Playgroud)
(或<command> && <command>等等)链式命令.但是,当我尝试后台第一个进程并链接第二个进程时,我收到以下错误:
/bin/sh: -c: line 0: syntax error near unexpected token `;'
在Makefile中处理进程并捕获PID的最佳方法是什么?
谢谢
- B
我正在尝试将Eclipse与现有的代码库一起使用.此代码将Makefile隐藏在项目源根目录下的几个目录中.如果我告诉eclipse这个埋藏的目录是项目的根目录,那么所有内容都会构建,但没有索引,因为Eclipse不知道源代码的来源.
如果我告诉Eclipse使用源的根,那么我就无法使Eclipse使用隐藏的makefile.
我已经阅读了Eclipse makefile问题的其他答案,但是我仍然遇到让Eclipse完美运行的问题 - 我还尝试了一个使用埋藏的Makefile但没有运气的自定义Builder schell脚本.
谢谢你的帮助!
我正在阅读使用GNU Make管理项目,并在第2.7章 - 自动依赖关系生成中找到了这个例子.作者从GNU手册中说出了他们:
%.d: %c
$(CC) -M $(CPPFLAGS $< > $@.$$$$; \
sed s',\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)
但是,我能够用这个做同样的事情(注意sed):
-include $(subst .c,.d,$(SOURCES))
%.d: %.c
@$(CC) -M $(CPPFLAGS) $< | sed 's|:| $*.d : |' > $@;
Run Code Online (Sandbox Code Playgroud)
所有这些行都是生成依赖项,然后添加*.d名称.他们不得不改变第一行:
foo.o: bar.h foo.h fubar.h
Run Code Online (Sandbox Code Playgroud)
to foo.o foo.d:bar.h foo.h fubar.h
我更简单,似乎工作得很好,但我认为GNU伙伴有他们sed命令的理由.也:
sed?为什么不简单地将它作为commond line参数我知道GNU的人也可以想到这些,但出于某种原因,选择了更复杂的设置.我只是想了解他们的推理,所以我可以动态地做这些.
makefile ×7
gnu-make ×3
c ×2
eclipse ×2
python ×2
android-ndk ×1
arguments ×1
class-method ×1
coding-style ×1
colon ×1
cygwin ×1
eclipse-cdt ×1
foreach ×1
initializer ×1
kernel ×1
linked-list ×1
linux-kernel ×1
path ×1
rules ×1
sh ×1
shell ×1
space ×1