尝试在 C++、MinGW 上获取当前进程内存大小时出错
Posted
技术标签:
【中文标题】尝试在 C++、MinGW 上获取当前进程内存大小时出错【英文标题】:Error when trying to get the current process memory size on C++, MinGW 【发布时间】:2016-07-27 12:39:08 【问题描述】:当我尝试调用 GetProcessMemoryInfo 时出现错误: 对“GetProcessMemoryInfo”的未定义引用
我已经看到了这个问题:Undefined reference to getprocessmemoryinfo@12
但这并不能解决我的问题。
我想知道我的进程在 RAM 中的大小,因此我需要使用“GetProcessMemoryInfo”方法。
我的问题是当我这样做时链接会中断。
CmakeLists.txt:
project(maxpath)
set(dir $CMAKE_CURRENT_SOURCE_DIR)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "$dir/build")
set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11 -static-libgcc -static-libstdc++ -static -m64 -lpsapi")
file( GLOB LIB_ALG algorithms/*.hpp )
file( GLOB LIB_DS datastructures/*.hpp )
file( GLOB LIB_LOG include/*.h)
set(GRID_GENERATOR
$LIB_ALG
$LIB_DS
$LIB_LOG
grid/generator.cpp
grid/grid.hpp)
set(GRID_SOLVER
$LIB_ALG
$LIB_DS
$LIB_LOG
grid/main_grid.cpp
grid/grid.hpp
include/memory_helper.cpp include/memory_helper.hpp include/fnv.h)
add_executable(gridGenerator $GRID_GENERATOR)
add_executable(gridSolver $GRID_SOLVER)
你可以看到我使用了-lpsapi
参数,
我得到的错误是:
[ 33%] Linking CXX executable "some path...\gridSolver.exe"
CMakeFiles\gridSolver.dir/objects.a(memory_helper.cpp.obj):memory_helper.cpp:(.text+0xf1): undefined reference to `GetProcessMemoryInfo'
CMakeFiles\gridSolver.dir/objects.a(memory_helper.cpp.obj):memory_helper.cpp:(.text+0x131): undefined reference to `GetProcessMemoryInfo'
C:/PROGRA~1/MINGW-~1/X86_64~1.3-P/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\gridSolver.dir/objects.a(memory_helper.cpp.obj): bad reloc address 0x0 in section `.pdata'
C:/PROGRA~1/MINGW-~1/X86_64~1.3-P/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.3/../../../../x86_64-w64-mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [some path.../gridSolver.exe] Error 1
CMakeFiles\gridSolver.dir\build.make:121: recipe for target 'some path.../gridSolver.exe' failed
mingw32-make.exe[2]: *** [CMakeFiles/gridSolver.dir/all] Error 2
CMakeFiles\Makefile2:103: recipe for target 'CMakeFiles/gridSolver.dir/all' failed
mingw32-make.exe[1]: *** [CMakeFiles/gridSolver.dir/rule] Error 2
CMakeFiles\Makefile2:115: recipe for target 'CMakeFiles/gridSolver.dir/rule' failed
mingw32-make.exe: *** [gridSolver] Error 2
makefile:130: recipe for target 'gridSolver' failed
我正在使用 CLion 和 mingw-w64\x86_64-4.8.3-posix-seh-rt_v3-rev2\mingw64
还有其他方法吗(使用 psapi 除外)?
【问题讨论】:
【参考方案1】:那里的答案是正确的。你应该链接到psapi
:
FIND_LIBRARY (PSAPI Psapi)
TARGET_LINK_LIBRARIES(gridSolver $PSAPI)
TARGET_LINK_LIBRARIES(gridGenerator $PSAPI)
或者您可以手动将其添加到链接器标志中 - 您已将其添加到示例中的编译器标志中。
【讨论】:
感谢您的分析,现在我收到此错误:为不是由该项目构建的目标“gridSolver”指定链接库。 那么您提供的示例显然是错误的,或者您将其粘贴到了错误的位置,因为您的示例显然有一个gridSolver
目标。如果您在add_executable
之前添加了target_link_libraries
,请阅读cmake 文档。
你说得对,我把它放在 add_executable 部分之前以上是关于尝试在 C++、MinGW 上获取当前进程内存大小时出错的主要内容,如果未能解决你的问题,请参考以下文章
C++ 怎么实现获取当前PC 硬盘 内存的大小以及已使用大小,加上CPU使用率
是否可以使用 c++ 获取与 WinCE 中指定进程关联的所有 Dll 的内存使用情况?