Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否可以通过makefile设置环境变量?_C_Unix_Makefile_Malloc_Gnu Make - Fatal编程技术网

C 是否可以通过makefile设置环境变量?

C 是否可以通过makefile设置环境变量?,c,unix,makefile,malloc,gnu-make,C,Unix,Makefile,Malloc,Gnu Make,我想利用MALLOC_扰动_环境变量的优势,这些变量可以更改内存分配参数(man 3 mallopt)。但是,我希望在应用程序级别控制分配参数,而不是整个系统级别。理想情况下,如果我能通过项目的makefile控制它们。我试图通过makefile更改提到的变量,但没有成功 为了进行测试,我创建了这个test.c文件: #include<stdlib.h> #include<stdio.h> #define N 50 int main() { char *cha

我想利用MALLOC_扰动_环境变量的优势,这些变量可以更改内存分配参数(man 3 mallopt)。但是,我希望在应用程序级别控制分配参数,而不是整个系统级别。理想情况下,如果我能通过项目的makefile控制它们。我试图通过makefile更改提到的变量,但没有成功

为了进行测试,我创建了这个test.c文件:

#include<stdlib.h>
#include<stdio.h>

#define N 50

int main()
{
    char *chars;
    int i;

    if (NULL == (chars = malloc(N * sizeof(*chars))))
        return EXIT_FAILURE;

    free(chars);

    for (i = 0; i < N; ++i)
        printf("%c", chars[i]);
    printf("\n");

    return EXIT_SUCCESS;
}
然后我尝试将编译封装在makefile中,但没有成功

导出变量

生成文件

all:
    export MALLOC_PERTURB_=110
    gcc test.c -o test
all:
    MALLOC_PERTURB_=110
    $(MAKE) rec

rec:
    gcc test.c -o test
结果(我期望110个字母为“n”)

递归调用make

生成文件

all:
    export MALLOC_PERTURB_=110
    gcc test.c -o test
all:
    MALLOC_PERTURB_=110
    $(MAKE) rec

rec:
    gcc test.c -o test
结果(我期望110个字母为“n”)

我试图从github的makefiles(包括MALLOC_扰动)中找到灵感,但它们太复杂了,我无法理解。 例如:

一些技术信息:

Linux 4.0.1-1-ARCH x86_64
gcc version 4.9.2 20150304 (prerelease) (GCC)
GNU Make 4.1

在Bash中,可以在命令前面指定环境变量,例如

MALLOC_PERTURB_=105 gcc test.c -o test

(我相信只有run必须设置这个变量,而不是compile。)


因为您使用的是Linux,所以Make很有可能使用Bash作为shell,您可以将上面的行放在Make文件中

Browning,在makefile中设置环境变量很容易,您已经这样做了,但这不是您想要的。这使得它在编译期间接受该值。但您希望它在运行程序时改变malloc的行为

阅读您引用的手册页可以确认您需要在程序运行的环境中设置环境变量。同样在阅读注释时,已经提到设置环境变量的makefile只对测试程序执行此操作,而测试程序实际上是作为构建的一部分运行的

您不希望它出现在makefile中。您希望在实际运行程序时设置它,这就是其他注释和答案告诉您的方法。对不起,我接了一个答案,但我需要更多的空间来澄清这一点,而且这是答案,给你。你已经知道怎么做了。你只是不知道它到底是什么。

你也可以在编译时设置“MALLOC\u扰动”值,方法是将
M\u扰动
选项传递给
mallopt()
函数(glibc 2.4或更高版本)。有关详细信息,请参阅

因此,如果您希望您的程序在编译时合并环境变量“MALLOC_扰动_”的设置,那么类似的方法应该可以工作:

#include<stdlib.h>
#include<stdio.h>

#include <malloc.h> // for mallopt() and M_PERTURB

#define N 50

int main()
{
    char *chars;
    int i;

#if MALLOC_PERTURB_
    mallopt( M_PERTURB, MALLOC_PERTURB_);
#endif

    if (NULL == (chars = malloc(N * sizeof(*chars))))
        return EXIT_FAILURE;

    free(chars);

    for (i = 0; i < N; ++i)
        printf("%c", chars[i]);
    printf("\n");

    return EXIT_SUCCESS;
}

为了我的启发,“sizeof(*chars)”这个表达是什么意思?sizeof()唯一知道的是'char*chars'的大小(对于32位系统)为4,而对指针的解引用为1。这似乎是一种复杂的表示sizeof(char)的方式,它在malloc()参数中始终是1,而且从来都不需要。在第一个示例中,与您的问题相关的唯一行是:'.PHONY:test test test:$(BIN)/gtest$(BASENAME)malloc\u扰动=21 malloc\u CHECK\u2 LD\u LIBRARY\u PATH=$(LIB)$(BIN)/gtest$(BASENAME)'其中2(临时)正在调用gtest之前设置环境变量。。。程序您可以在
导出
行后添加分号和反斜杠,它将起作用。目前,
make
创建一个运行
export
的shell,然后创建另一个shell来运行测试(因此第二个shell对导出的变量没有任何线索)。我的建议迫使
make
将这两行视为一行。还有一个指令可以添加到
makefile
中,它告诉GNU
make
在一个shell中运行目标的所有操作;考虑到sizeof:我更喜欢使用sizeof(*VARIABLE\u NAME)而不是sizeof(VARIABLE\u TYPE),因为它允许我快速、安全地更改变量类型。这样我就不必在代码中搜索所有出现的sizeof(VARIABLE_TYPE)。有关更多信息,请参阅此问题的公认答案:()。可能的副本不是bash特定的:任何行为类似Bourne shell的shell都会这样做。
MALLOC_PERTURB_=105 ./test
#include<stdlib.h>
#include<stdio.h>

#include <malloc.h> // for mallopt() and M_PERTURB

#define N 50

int main()
{
    char *chars;
    int i;

#if MALLOC_PERTURB_
    mallopt( M_PERTURB, MALLOC_PERTURB_);
#endif

    if (NULL == (chars = malloc(N * sizeof(*chars))))
        return EXIT_FAILURE;

    free(chars);

    for (i = 0; i < N; ++i)
        printf("%c", chars[i]);
    printf("\n");

    return EXIT_SUCCESS;
}
gcc -DMALLOC_PERTURB_=97 test.c -o test