Tag: makefile

如何收集大型Makefile项目的所有依赖项?

在一个大型C项目中,我有一个顶级Makefile和许多子Makefile在不同的子目录中。 我需要收集编译的所有依赖项。 为此,我将-MMD添加到CFLAGS并获取一堆.d依赖文件。 这些.d文件分散在子目录中。 此外,依赖关系有时被写为绝对路径,有时作为与编译目录相关的路径,有时包含符号链接。 我编写了一个脚本,它可以找到所有.d文件,遍历它们的目录,并解析所有找到的路径。 这有效,但有数万个依赖项文件,这个依赖项集合与编译大致相同! (等待太长了:)) 有没有更快的方法来获取单个文件中的所有依赖项? 如果这很重要,那就是ANSI C,GCC和Linux。 提前致谢。

在Makefile中获取源代码结构

我正在研究一个C项目,我决定将源代码及其对象放在不同的目录中。 根目录有类似的东西: SmartC ▶ tree -L 1 . ├── built ├── doc ├── Makefile ├── README.md ├── src ├── tests └── trash 因此,在src和内置目录中,我将另外两个Makefile用于编译和链接作业。 src目录(我放置源代码的地方)具有以下结构: src ├── graph.c ├── graph.h ├── list.c ├── list.h ├── main.c ├── Makefile ├── node.c ├── node.h ├── tree.c ├── tree.h └── types ├── complex.c ├── complex.h ├── matrix.c └── matrix.h […]

Makefile和跨平台开发

我一直在试图弄清楚如何创建一个可以为所有主要操作系统编译的C程序。 我考虑过使用makefile,所以我只需要更改目标操作系统,但是我遇到了一些问题。 我的第一个问题是我无法弄清楚如何更改目标操作系统,因此我可以在一个操作系统上编译,但在所有操作系统上使用该应用程序。 我的第二个问题是我无法弄清楚如何让它自动编译src目录中的所有.c文件,所以每次添加新文件时我都不必修改makefile。 有谁知道怎么做这个东西? 我当前的makefile(目前尚未修改) CC=gcc CFLAGS=-c -Wall LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@q2

架构x86_64的未定义符号:(Mac OS X 10.7)

我正在为我的CS课程学习MP。 我们的计算机实验室正在Linux OS下工作,但我尝试在家用计算机上编译代码(Mac OS X)。 我收到以下错误: Undefined symbols for architecture x86_64: “_tdestroy”, referenced from: _dictionary_destroy in libdictionary.o _dictionary_destroy_free in libdictionary.o ld: symbol(s) not found for architecture x86_64 我尝试在网上找到解决方案,但我没有成功。 我们在Makefile中使用以下宏: CC = gcc INC = -I. FLAGS = -g -W -Wall LIBS = -lpthread 有任何想法吗?

Makefile条件包括

我正在尝试编写一个需要ALSA或OSS标头的应用程序。 基本上,如果/etc/oss.conf不存在,我想将一个定义传递给编译器,因为这可能意味着soundcard.h头不存在(随意在那个上纠正我,我还是新的与OSS合作)。 根据OSS文档,您将使用include指令,如下所示: include /etc/oss.conf CFLAGS := -I$(OSSLIBDIR)/include/sys 一个问题。 OSS支持是可选的,所以我想检查标头是否存在,如果存在,则将定义传递给编译器。 问题是,AFAIK无法检查文件是否存在于makefile 规则之外 。 在规则内部,如果我使用if语句,由于某种原因,尝试设置CFLAGS不会改变它: test: $(objects) @if [ -f ${OSS_CONFIG} ]; then \ . ${OSS_CONFIG}; \ CFLAGS+=” -I${OSSLIBDIR} -DUSE_OSS”; \ fi @echo ${CFLAGS} (上面只输出CFLAGS的原始值,即使存在${OSS_CONFIG} 。)这当然非常难看,我想知道是否有更清洁的方法。 或者我正在采取的方式引发一场涉及小猫种族灭绝的全球灾难性事件? 哦,请不要告诉我使用autoconf。

gcc,make:如何禁用警告失败?

我正在尝试使用AVR微控制器和avr-ada构建gcc,我遇到了一个障碍,因为我的常规编译器对AVR所需的版本过于挑剔。 我收到以下警告,这反过来导致gcc或make报告错误: gcc -c -g -O2 -gnatpg -gnata -nostdinc -I- -I. -Iada -I../../gcc/ada ../../gcc/ada/exp_ch5.adb -o ada/exp_ch5.o exp_ch5.adb:177:16: warning: function “Has_Address_Clause” is not referenced make[2]: *** [ada/exp_ch5.o] Error 1 make[1]: *** [all-gcc] Error 2 make: *** [all] Error 2 有没有办法指示gcc或使警告不失败?

extern C的未定义引用

我正在尝试使用Netbeans(g ++)编译一个包含开源源代码库 Aquila 的程序 。 我按照安装说明进行操作 。 但是当试图编译一个小的测试程序时,我得到了这个错误 In function `Aquila::OouraFft::fft(double const*)’:OouraFft.cpp:(.text+0x24f): undefined reference to `cdft’ OouraFft.h: #include “Fft.h” extern “C” { void cdft(int, int, double *, int *, double *); //prototypes of offending function void rdft(int, int, double *, int *, double *); //second one. } libs文件夹中的C文件包含函数的定义。 导致OouraFft.cpp中的实际错误的行: // let’s call the C function […]

多个目录中的头文件:最佳实践

我是C Newb 我用动态语言(javascript,python,haskell等)写了很多代码,但我现在正在为研究生院学习C,我不知道我在做什么。 问题 最初我使用makefile在一个目录中构建我的所有源代码,该代码运行得相当好。 但是,我的项目正在增长,我想将源分成多个目录(unit testing,工具,核心等)。 例如,我的目录树可能如下所示: . |– src | |– foo.c | |– foo.h | `– main.c `– test `– test_foo.c test/test_foo.c使用src/foo.c和src/foo.h test/test_foo.c 使用makefile,构建它的最佳/标准方法是什么? 优选地,将存在用于构建项目的一个规则和用于构建测试的规则。 注意 我知道还有其他方法可以做到这一点,包括autoconf和其他自动解决方案。 但是,我想了解发生了什么,并且能够从头开始编写makefile,尽管它可能不切实际。 任何指导或提示将不胜感激。 谢谢! [编辑] 所以到目前为止给出的三个解决方案如下: 将全局使用的头文件放在并行include目录中 使用#include声明中的路径,如#include “../src/foo.h” 使用-I开关通知编译器包含位置 到目前为止,我喜欢-I switch解决方案,因为它不涉及在目录结构更改时更改源代码。

生成多个输出文件时无法指定-o

我有一个关于make文件使用gcc的问题,下面是我在makefile中的代码。 我在生成多个输出文件错误时无法指定-o,但我只是看不出问题出在哪里。 有人可以指出我的错误吗? 谢谢! BASE_FILES=bwtsearch.c bwtsearch.h bwttext.c bwttext.h chartable.c chartable.h common.h occtable.c occtable.h plset.c plset.h strbuf.c strbuf.h BASE_ENCODER_FILES=bwtencoder.h bwtencoder.c BWTSEARCH_FILES=${BASE_FILES} main_bwtsearch.c BENCODE_FILES=${BASE_ENCODER_FILES} main_bencode.c PSEARCH_FILES=${BASE_FILES} main_psearch.c PSEARCH_NL_FILES=${BASE_FILES} main_psearch_nl.c PENCODE_FILES=${BASE_ENCODER_FILES} main_pencode.c PENCODE_NL_FILES=${BASE_ENCODER_FILES} main_pencode_nl.c DEBUG_FILES=${BASE_FILES} main_debug.c all: bwtsearch psearch psearch_nl pencode pencode_nl bencode clean: rm psearch psearch_nl bwtsearch pencode pencode_nl bencode bwt_debug bwtsearch: ${BWTSEARCH_FILES} gcc -o bwtsearch ${BWTSEARCH_FILES} […]

错误:从’void *’转换为’int’会在makefile中丢失精度

在ubuntu 12.04 LTS(64位)上编译以下makefile时遇到此错误: Ana.cxx:21:46: error: cast from ‘void*’ to ‘int’ loses precision [-fpermissive] 在这一行: 21 : TThread::Printf(“Start of Ana %x \n” ,(int)ptr); 这是makefile: ObjSuf = o SrcSuf = cxx DllSuf = so ExeSuf = OutPutOpt = -o CXXFLAGS = -g -Wall -fPIC -DOSF1 CXX = g++ CCFLAGS = -g -Wall -DOSF1 CC = gcc LD […]