在Linux中用C++获取源文件目录

3

这个问题已经被问了很多次,我也参考了所有的解答,但我需要的有些不同。

我正在使用 MacBook,并在 Clion(IDE)中编写 C++ 程序。我的程序文件位于以下路径:

/Users/Kandarp/ClionProjects/SimulationParser/main.cpp

当我使用以下函数获取当前目录时,它会返回不同的文件(我认为是实际编译和执行文件所在的路径):

string ExePath() {
char cwd[1024];
if (getcwd(cwd, sizeof(cwd)) != NULL) {
    fprintf(stdout, "Current working dir: %s\n", cwd);
    return cwd;
} else {
    perror("getcwd() error");
    return 0;
}}

它给出了以下答案:/Users/Kandarp/Library/Caches/CLion2016.2/cmake/generated/SimulationParser-50b8dc0e/50b8dc0e/Debug

但我需要我的.cpp文件所在的路径,我做错了什么吗?请帮忙。


3
C++是一种用于编写实际程序的语言,这些程序可以在全球数百万台计算机上运行。你的程序在客户端电脑上运行时,为什么需要知道开发者电脑上.cpp文件的路径呢?这是因为C++编译器需要知道该路径,链接器需要知道目标文件的路径,而在此之后,你就不再需要这些路径了。 - MSalters
1
我需要知道我的 .cpp 文件所在的路径。为什么需要知道呢?如果你构建了程序并将可执行文件复制到另一台机器上,会发生什么?你还需要在开发计算机上指定路径吗? - n. m.
没错,n.m.。在移动可执行文件后,我不需要开发者机器的路径。我之前理解有误,所以才会有这个需求。 - kandarp
3个回答

3

你没有做错什么。

getcwd()函数可以给你返回当前执行进程的目录。

当你使用任何工具来构建C++代码并运行时,它会从那个目录中运行进程。

C++库中没有任何东西能够告诉应用程序源代码的位置。

如果你需要应用程序知道自己的源代码位置,需要将其作为main()函数的参数传递或者将其放入某个配置文件让你的应用程序读取,或采用类似的方法。


谢谢您的回复。我在C++环境中有些新,您能给我提供一些可执行的例子吗? - kandarp

1
你需要做的是使用__FILE__宏,然后使用基本的分词方法来提取目录名称。
你的方法不起作用,因为在执行过程中,当前目录是二进制文件的目录,而不是编译单元的目录。

0
如果您使用cmake,请将以下内容添加到源代码目录的CMakeLists.txt文件中:
add_definitions(-DMY_SRC_DIR="${CMAKE_CURRENT_SOURCE_DIR}")

在你的add_library()或add_executable()之前。然后,在你的源代码中,你可以使用MY_SRC_DIR作为宏定义:

std::string mySrcDir = MY_SRC_DIR;

一开始你的IDE可能不会喜欢它,直到你重新运行cmake,然后它就会解决那个宏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接