为什么我使用 Cmake 构建和 VS 2019 构建时相对路径不同?

语言服务提供商

我是 Cmake 的新手。我尝试使用 Cmake 来构建我的项目。

在我的项目中,我需要在运行时加载一些资源。例如:

string inFileName = "../Resources/resource.txt";
// string inFileName = "../../Resources/resource.txt";
ifstream ifs;
ifs.open(inFileName.c_str());
if (ifs) {
....
}

但是当我使用命令行cmake ../cmake --build . --config Release在项目/构建中时。我的文件路径应该相对于${PROJEDCT_BINARY},即inFileName = "../resources/resource.txt".

但是当我使用cmake ../VS2019打开sln文件然后右键构建运行时,我的文件路径应该是相对于可执行文件的,即inFileName = "../../resources/resource.txt".

不知道为什么会这样,我上网一搜,好像没有人遇到过这个愚蠢的问题……

下面是我的文件结构。

|--3rdParty
|----CmakeLists.txt
|--include
|----header.h
|--source
|----source.cpp
|----CmakeLists.txt
|--resources
|----resource.txt
|--CmakeLists

和我的根 CmakeLists.txt

cmake_minimum_required(VERSION 3.12)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(OBMI VERSION 0.1.0.0 LANGUAGES C CXX CUDA)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})

add_subdirectory(3rdParty)

add_subdirectory(source)

源码/CmakeLists.txt

add_executable(mSI)

target_sources(mSI PRIVATE
    ${PROJECT_SOURCE_DIR}/include/header.h
    # source
    source.cpp
)

target_include_directories(multiSpectrumImaging 
    PRIVATE 
    ${PROJECT_SOURCE_DIR})

target_link_libraries(mSI
    PRIVATE
    ...
)
编码

使用相对路径加载文件时,最终文件名的解析取决于当前工作目录。相对路径附加到该工作目录。当前工作目录不一定与您的应用程序的路径相同;它将是启动应用程序的周围环境的路径(或者可以专门为大多数 IDE 中的调试环境设置)。

当您不是从 IDE运行程序时,您没有具体指定如何运行程序- 只需双击可执行文件即可?您也没有告诉我们可执行文件相对于您的源代码的构建位置?

特别是为了从 Visual Studio 运行,您可以在项目属性的“调试”部分中设置工作目录。

对于更灵活的解决方案,我通常做的是确定可执行文件的路径,然后附加相对路径以加载资源。基本上,完整的可执行路径存储在argv[0](如果你有一个int main(int argc, char** argv) {...},即你的 main 函数的第二个参数的第一个元素)。有关这方面的更多信息,请参见其他问题的答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我使用 Cmake 构建和 VS 2019 构建时相对路径不同?

VS 2019 使用 MSBuild.exe 和 VSTest.console.exe 自动构建和测试

使用ansible构建时在Dockerfile中设置相对路径

如何使用 CMake 复制现代 IDE 的“构建和运行”功能?

HelloWorld:使用CMake下载,构建和链接Boost

如何使用CMake构建和链接外部库?

CMake:将相对路径转换为绝对路径,并将构建目录作为当前目录

如何告诉CMake使用相对路径

使用没有相对路径的 CMake 创建 Zip

更新到 VS 2019 16.11.1 后没有自动构建 QT Cmake 项目

为什么我在 cmake 生成构建文件夹时丢失了一些文件?(Maya 2020 - CMake 3.16.4 - VS 2017)

在VS中构建和发布之间的区别?

使用 CMake 获取、构建和链接 SDL2 失败,并显示未定义的 `floor` 引用

流星-构建和使用集合

无法使用VS 2019构建Web应用程序

在 VS2019 中使用 clang-cl 构建项目

如何使用VS 2019构建Net Core 3.0应用

VS 2017 中的 CMake 在构建时不显示构建日志

在Windows 10 VS2015上使用Python和GPU支持构建和编译OpenCV

如何在 VS 2022 中编写原生 C++,使用 Linux 进行构建和测试

自定义Angular-CLI以在构建时修改相对路径

在构建项目时,由于相对路径,webpack会给出错误

Spring Boot 2.2.1 RELEASE构建错误相对路径

Vuejs,难以通过相对路径进行构建

使用CMake构建Metallib

使用CMake构建zLib

如何使用相对路径将共享库与CMake链接

使用 VS2019 构建时使用 Qt5qml 的应用程序崩溃

自动化构建和发布管理VS2012