我正在尝试这样做:
从目录中选择所有C( .c) 文件,生成.o并将其添加到我的最终目标可执行文件中。这些C文件可以随时添加或删除,因此当我make为我的目标运行时,必须C从目录中挑选可用的文件来编译并链接到我的目标。
到目前为止,我有以下几点:
define test_tgt =
DIR = full/path/to/dir
FILES = $(wildcard $(DIR)/*.c)
OBJS = <rule-to-convert-C-to-O>
endef
get_new_files:
$(eval $(test_tgt))
final-target: get_new_files
$(CC) <other-objs> $(OBJS)
Run Code Online (Sandbox Code Playgroud)
不知何故,这似乎不起作用。我看到很多类似的例子,但不确定这里有什么问题。如果这种方法不正确,任何人都可以提出更好的方法来实现这一点。
TIA。
有一个耗时的步骤来展平一堆文件。
基本上我希望这是有效的语法
%.out: %.input1 %.input2
merge $<1 $<2 $@
doit: project.out
# project.out merged
Run Code Online (Sandbox Code Playgroud)
我远非 makefile 专家,但我喜欢使用 .SULFFIXS 来做到这一点,当只有两个文件时,将其适应两个输入或两个输出以备将来使用会很棒......
.SULFFIX: .in.out
.in.out:
dosomething $< $@
doit: project.out
Run Code Online (Sandbox Code Playgroud)
GNU 制作 3.81
我发现了一些关于如何制定具有多个输出的规则的讨论,但没有一个具有多个输入的讨论。
我使用shell(bash,但我需要可移植性)和GNU Makefile.我有这个代码:
check_commands:
command -v find >/dev/null
command -v asdf >/dev/null
Run Code Online (Sandbox Code Playgroud)
假设,第一个命令被传递,第二个命令中止Makefile并出错.现在,我删除了>/dev/null.那为什么呢
check_commands:
command -v find
Run Code Online (Sandbox Code Playgroud)
产生以下错误?
make: command: Command not found.
Run Code Online (Sandbox Code Playgroud) 在bobbogo对Stack Overflow问题的回答如何在makefile中编写循环?,它显示了如何在makefile中编写以下伪代码的等价物:
For i in 1, ..., n:
Add the following rule "job_$i: ; ./a.out $i > output_$i"
Run Code Online (Sandbox Code Playgroud)
正如答案本身所述,bobbogo解决方案的优点在于,如果指定"-j num_threads",则作业将并行运行.其他明显的,更简单的解决方案,没有这个属性.
我的问题:我怎么能做同样的事情,但对于嵌套循环,即:
For i in 1, ..., n:
For j in 1, ..., m:
Add the following rule "job_$i_$j: ; ./a.out $i $j > output_$i_$j"
Run Code Online (Sandbox Code Playgroud)
我只期待使用GNU Make.提前致谢!
如何在makefile中打印换行符?
例如,如果我有一个目标:
printIt:
@echo "Compiling..."
Run Code Online (Sandbox Code Playgroud)
我怎么能打印出来
Compiling...
我在某处读到过,你可以定义一个。但我已经尝试过这里提到的内容:
define \n
endef
printit:
@echo "${\n}Compiling..."
Run Code Online (Sandbox Code Playgroud)
但这不会打印换行符。我也尝试过 C++ 风格的“\n”。我正在使用GNU Make 3.81.
我正在使用来自https://github.com/contiki-os/contiki的源文件我添加了一个新目录(比如/foo),其中包含一些 .c 和 .h 文件
我需要在 上使用它们examples/cc26xx,尽管我将 .h 文件(在 下/foo)包含在cc26xx-demo.c 中,但在我运行时它并没有真正包含这些文件make
谁能告诉我如何将它们包含在examples/cc26xx/Makefile或Makefile.include 中
如何正确定位libstdc++.so.*用于编译 autotools 项目,以便将其与发行版捆绑在一起?
在我们团队切换到 C++11 后,我们需要将新的 libstdc++.so.6 与我们软件的每个发行版捆绑在一起,但是如何正确找到该库?
/lib/gcc/x86_64-pc-cygwin/5.2.0/usr/lib64/usr/local/gcc-5.2.0/lib64我已经尝试过:
install-exec-local:
cp $(shell dirname $(shell which ${CXX}))/../lib64/libstdc++.so.6 ${prefix}/lib
Run Code Online (Sandbox Code Playgroud)
(而不是make dist,我们make install进入一个配置的前缀然后捆绑前缀)
这有效,但不适用于 Cygwin,我不确定它是否适用于其他平台,因此我的问题。
有关与软件捆绑的基本原理,请参阅此问题libstdc++.so。它运作良好。我们还使用dlopen加载.so依赖的 s,libstdc++.so因此静态链接比听起来更难。
唯一的问题是定位libstdc++.so.6在make dist时间(或我们的等价物),让我可以cp它为我们分发的${prefix}/lib目录,前焦油gzip压缩,并将其提供给客户。理想情况下,我正在寻找类似g++ --print-path-to-libstdc++.so.
运行软件的目标系统有一个较旧 libstdc++.so的 .
我正在使用cmake版本3.2.2,因为这是代码的要求,
我试图构建MikTex源代码,但是在Ubuntu 14.04 LTS上遇到了我不知道的不同错误。当我cmake -G "Unix Makefiles"从源代码文件夹“ miktex-2.9-2015-12-22”的目录运行命令时,出现以下错误:
/usr/lib/x86_64-linux-gnu/cmake/Qt5/Qt5Config.cmake:26(find_package)处的CMake错误:找不到“ Qt5UiTools”提供的具有以下任何名称的软件包配置文件:
Qt5UiToolsConfig.cmake
qt5uitools-config.cmake
Run Code Online (Sandbox Code Playgroud)
将“ Qt5UiTools”的安装前缀添加到CMAKE_PREFIX_PATH或将“ Qt5UiTools_DIR”设置为包含上述文件之一的目录。如果“ Qt5UiTools”提供了单独的开发包或SDK,请确保已安装它。调用堆栈(最近的调用优先):CMakeLists.txt:466(find_package)
-配置不完整,发生错误!
我有以下Makefile,我想将其配置为默认生成调试版本并通过指定相应的目标发布版本。
我现在正在尝试解决的问题如下, - 项目包含单元测试,我希望它们包含在默认构建中,但从发布中排除,所以我将发布目标添加到 Makefile:
FC = ifort
FFLAGS = -c -free -module modules -g3 -warn all -warn nounused
LDFLAGS = -save-temps -dynamiclib
INTERFACES = src/Foundation.f units/UFoundation.f units/Asserts.f units/Report.f
EXCLUDES = $(patsubst %, ! -path './%', $(INTERFACES))
SOURCES = $(INTERFACES) \
$(shell find . -name '*.f' $(EXCLUDES) | sed 's/^\.\///' | sort)
OBJECTS = $(patsubst %.f, out/%.o, $(SOURCES))
EXECUTABLE = UFoundation
all: $(SOURCES) $(EXECUTABLE)
release: SOURCES := $(filter-out units/%.f, $(SOURCES))
release: OBJECTS := $(filter-out units/%.o, $(OBJECTS))
release: EXECUTABLE := 'Foundation.dlyb' …Run Code Online (Sandbox Code Playgroud) 我偶然发现了一个看起来很奇怪的Makefile,我听不懂
这是那个Makefile
AS=as -32 -Iinclude
LD=ld -m elf_i386
CC=gcc -m32 -fno-pie -fno-stack-protector
CPP=gcc -E -nostdinc -Iinclude
CFLAGS=-W -nostdlib -Wno-long-long -I include -fomit-frame-pointer
.s.o:
${AS} -a $< -o $*.o >$*.map
all: boot setup
boot: boot.o
${LD} --oformat binary -N -e start -Ttext 0x0000 -o boot $<
setup: setup.o
${LD} --oformat binary -N -e start -Ttext 0x0000 -o setup $<
clean:
rm -f boot setup *.o *.map
Run Code Online (Sandbox Code Playgroud)
我不明白的部分是
.s.o:
${AS} -a $< -o $*.o >$*.map
Run Code Online (Sandbox Code Playgroud)
.s.o在这种情况下的意义是什么,以及该$*.o >$*.map尝试做什么。