小编Rus*_*llG的帖子

如何将对象文件放在单独的子目录中

我在尝试使用make将目标文件放在一个单独的子目录中时遇到了麻烦,这可能是一种非常基本的技术.我尝试使用此页面中的信息:http: //www.gnu.org/software/hello/manual/make/Prerequisite-Types.html#Prerequisite-Types

我从make获得以下输出:

make: *** No rule to make target `ku.h', needed by `obj/kumain.o'.  Stop.
Run Code Online (Sandbox Code Playgroud)

但是ku.h是一个依赖而不是一个目标(尽管它显然是在c源文件中的#included).当我不尝试使用目标文件的子目录(即错过OBJDIR部分)时,它工作正常.为什么认为ku.h是目标?

我的makefile是这样的:(风格是在阅读各种信息来源后)

.SUFFIXES:
.SUFFIXES: .c .o

CC=gcc 
CPPFLAGS=-Wall
LDLIBS=-lhpdf
VPATH=%.c src
VPATH=%.h src
VPATH=%.o obj
OBJDIR=obj

objects= $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \
  kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \
  kushapes.o )

ku : $(objects)
  $(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)

$(objects) : ku.h kudefines.h kuglobals.h kufns.h | $(OBJDIR)

$(OBJDIR):
  mkdir $(OBJDIR)

.PHONY: clean
clean :
  rm $(objects)
Run Code Online (Sandbox Code Playgroud)

编辑:我应用了更改以使用vpath指令.我的版本是VPATH = xxx和vpath%.c xxx的错误混合.但是我现在得到了另一个问题(这是我添加错误的vpath之前的原始问题).这是输出: …

makefile gnu-make

56
推荐指数
5
解决办法
11万
查看次数

线程是否可以在不锁定的情况下写入相同结构数组的不同元素?

我正在尝试在GCC C应用程序中使用线程(第一次!),它在非线程模式下工作正常.当我运行它时,一些线程给出的结果都是零,而不是所需的答案(我知道用于检查目的),但是每次运行它时给出零的线程都不一样.给出非零答案的答案是正确的,因此代码似乎运行正常.我想知道是否有人可以指出我可能有一些非线程安全的区域.

我自己的想法可能是由于我如何收集结果或内存分配 - 我使用malloc和free而在StackOverflow中的其他地方我看到GCC malloc被认为是线程安全的,如果与-lpthread链接(我正在做).什么都不使用全局/静态变量 - 一切都作为函数参数传递.

为了将结果传递回main,我的线程例程使用了一组结构.每个线程都写入此数组的不同元素,因此它们不会尝试写入同一个内存.也许我在编写结果时需要使用某种形式的锁定,即使它们没有转到结构数组的相同元素?

我在这里遵循线程代码的配方:https: //computing.llnl.gov/tutorials/pthreads/#Abstract

我附加(简化)代码提取,以防这提供任何线索(我可能已经省略/修改了错误的东西,但我不是要求任何人发现错误,只是一般的方法).

typedef struct p_struct { /* used for communicating results back to main */
    int given[CELLS];
    int type;
    int status;
    /*... etc */
} puzstru;

typedef struct params_struct { /* used for calling generate function using threads */
    long seed;
    char *text;
    puzzle *puzzp;
    bool unique;
    int required;
} paramstru;
/* ========================================================================================== */
void *myfunc(void *spv) /* calling routine for use by threads */
{
    paramstru *sp=(paramstru …
Run Code Online (Sandbox Code Playgroud)

c multithreading gcc thread-safety

13
推荐指数
2
解决办法
6483
查看次数

标签 统计

c ×1

gcc ×1

gnu-make ×1

makefile ×1

multithreading ×1

thread-safety ×1