我是 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] 删除。
我来说两句