Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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中打印程序编译位置的路径_C_Environment Variables - Fatal编程技术网

如何在c中打印程序编译位置的路径

如何在c中打印程序编译位置的路径,c,environment-variables,C,Environment Variables,我知道我们可以使用类似于getcwd()的方法打印当前工作目录的路径,但是如果程序在一个地方编译,而可执行文件被复制到另一个地方,它会将结果作为新目录 编译过程中如何存储getcwd()或其他内容的值?根据您的编译器,这可能会起作用: #include<stdio.h> int main() { printf("This file path: %s\n", __FILE__); } #包括 int main() { printf(“此文件路径:%s\n”,\u文件\u); }

我知道我们可以使用类似于
getcwd()
的方法打印当前工作目录的路径,但是如果程序在一个地方编译,而可执行文件被复制到另一个地方,它会将结果作为新目录


编译过程中如何存储
getcwd()
或其他内容的值?

根据您的编译器,这可能会起作用:

#include<stdio.h>

int main()
{
  printf("This file path: %s\n", __FILE__);
}
#包括
int main()
{
printf(“此文件路径:%s\n”,\u文件\u);
}
\uuuuu FILE\uuuu
是一个预定义的字符串文字,它包含编译时.c文件的完整路径

如果您只需要目录,您需要通过一些简单的字符串操作来删除文件名


这在Visual Studio 2017下工作。我没有在其他平台上测试它。显然,在大多数其他平台上,文件只包含文件名,而没有路径。

这取决于您的编译器:

#include<stdio.h>

int main()
{
  printf("This file path: %s\n", __FILE__);
}
#包括
int main()
{
printf(“此文件路径:%s\n”,\u文件\u);
}
\uuuuu FILE\uuuu
是一个预定义的字符串文字,它包含编译时.c文件的完整路径

如果您只需要目录,您需要通过一些简单的字符串操作来删除文件名


这在Visual Studio 2017下工作。我没有在其他平台上测试它。显然,在大多数其他平台上,文件只包含文件名而没有路径。

您可以将其作为编译时传递定义:

#include <stdio.h>

int main(void) {
    printf("COMPILE_DIR=%s\n", COMPILE_DIR);
    return 0;
}
导致:

/dir1$ ./current 
COMPILE_DIR=/dir1
/dir1$ cd /dir2
/dir2$ cp /dir1/current ./
/dir2$ ./current
COMPILE_DIR=/dir1

您可以将其作为编译时定义传递:

#include <stdio.h>

int main(void) {
    printf("COMPILE_DIR=%s\n", COMPILE_DIR);
    return 0;
}
导致:

/dir1$ ./current 
COMPILE_DIR=/dir1
/dir1$ cd /dir2
/dir2$ cp /dir1/current ./
/dir2$ ./current
COMPILE_DIR=/dir1

您可以使用makefiles执行此操作,在makefile中,添加保留
pwd
结果:

生成文件:

CFLAGS += -DCURRENT_DIR=\"$(shell pwd)\"
在c文件中,使用以下值:

#include <stdio.h>

int main(void)
{
    printf("file %s compiled from %s\n", __FILE__, CURRENT_DIR);
    return 0;
}    
#包括
内部主(空)
{
printf(“文件%s从%s\n编译而来,_文件,当前目录);
返回0;
}    

您可以使用makefiles执行此操作,在makefile中,添加一个保留
pwd
结果:

生成文件:

CFLAGS += -DCURRENT_DIR=\"$(shell pwd)\"
在c文件中,使用以下值:

#include <stdio.h>

int main(void)
{
    printf("file %s compiled from %s\n", __FILE__, CURRENT_DIR);
    return 0;
}    
#包括
内部主(空)
{
printf(“文件%s从%s\n编译而来,_文件,当前目录);
返回0;
}    

如果在构建过程中使用cmake,可以将
添加定义(-DSOME\u DIR=“${cmake\u CURRENT\u BINARY\u DIR}”)
添加到正确的CMakeLists.txt文件中。这相当于在代码中定义一些_DIR“binaries _DIR”


或者,您可以使用任何其他构建自动化工具来确保编译器通过了正确的-D(GNU)或/D(MSVC)标志来生成正确的定义(或者手动将其传递给编译器,这与在代码中指定它没有什么不同)。

如果在构建过程中使用cmake,您可以添加
添加定义(-DSOME_DIR=”${CMAKE_CURRENT_BINARY_DIR}“
到正确的CMakeLists.txt文件。这相当于在代码中定义一些_DIR“binaries_DIR”


或者,您可以使用任何其他构建自动化工具来确保编译器通过正确的-D(GNU)或/D(MSVC)标志来生成正确的定义(或者手动将其传递给编译器,这与在代码中指定它没有什么不同).

我认为您不能完全按照自己的意愿来做,但是您可以使用
\uuuu FILE\uuuu
来获取文件的路径,就像编译器指定的那样。如果您使用
gcc-c FILE.c
那么
\uu FILE\uuuu
将不包含路径,但是如果您使用
gcc-c/home/fred/FILE.c
那么它将包含路径。或者,您可以uld从Makefile中准确地传递您想要的内容作为您自己的maco,然后使用文件中的宏。我认为您不能准确地执行您想要的操作,但是您可以使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu您可以使用
gcc-c/home/fred/file.c
,然后它将包含路径。或者,您可以从Makefile中传入您想要的内容作为自己的maco,然后使用文件中的宏。好的,所有已知的编译器都允许声明编译时宏。但并非所有的编译器都将gcc作为名称…@SergeBallesta:gcc调用是作为示例-说明使用编译时定义的建议解决方案。在不同的平台上,这可能会有所不同,但我肯定不可能列出操作系统、IDE、构建工具、编译器、外壳等所有可能组合的示例。好的,所有已知的编译器都允许声明编译时宏。但并非所有编译器都有gccs name…@SergeBallesta:gcc调用只是一个例子,说明了使用编译时定义的拟议解决方案。在不同的平台上,这可能会有所不同,但我肯定不能期望我列出一个示例,说明操作系统、IDE、构建工具、编译器、shell等所有可能的组合,
\uuuuuuuuu文件\uuuuuuu
没有给出充分的解释它只给出了一个与我编译程序的位置相关的路径。当我移动程序时,相对路径也是错误的executable@UditSanghi是的,显然这取决于平台。
\uuuuu FILE\uuuu
没有给出完整的路径。它只给出了与我编译程序的位置相关的路径。当我移动ecutable@UditSanghi是的,显然这取决于平台。