内容摘要:
笔者在Visual Studio 2022上配置metis软件包、vcpkg后运行ue5-nanite-core代码时,编译后成功后,运行出现LNK1104:无法打开文件“GKlib.lib”问题。经过查询以后发现metis编译后的GKlib文件夹中不存在GKlib.lib这个文件,为此给出以下解决办法。
关于metis安装配置:Windows+VS2022安装METIS软件包-优快云博客
关于vcpkg安装配置:Windows安装vcpkg教程(VS2022)-优快云博客
目录
一、问题描述
笔者在Visual Studio 2022上配置metis软件包、vcpkg后运行ue5-nanite-core代码时,编译后成功后,运行出现LNK1104:无法打开文件“GKlib.lib”问题,如下图所示。NK1104 错误表示链接器无法找到或打开指定的库文件,其中metis软件包是通过CMake编译生成的,因此可能是CMake编译过程中出现的问题,或解压metis过程中文件缺失。
GKlib.lib 是一个库文件,通常用于链接器在生成可执行文件或动态库时引用。
二、开发环境
1.操作系统:Win10/Win11
2.开发工具:Visual Studio 2022
3.开发语言:C/C++
4.METIS版本:5.1.0
5.CMake版本:3.21.5
三、添加GKlib.lib
若在GKlib文件夹下无法查询到GKlib.lib文件,则是CMake 并未明确定义生成 GKlib.lib 文件的目标,这是导致链接错误的主要原因。(若可以查询到GKlib.lib文件,直接跳转到步骤3.确认子模块的构建。)
1. 修改 GKlib 的 CMakeLists.txt
确保GKlib文件夹下的CMakeLists.txt包含生成静态库或动态库的指令,即以下内容:
(此处以添加静态库为例,要注意和metis文件夹下CMakeLists.txt的库的类型统一,都为静态库或都为动态库)
# 添加一个静态库目标
add_library(GKlib STATIC ${GKLIB_SRC} ${GKLIB_HEADERS})
若无该指令,添加至GKlib文件夹下的CMakeLists.txt中,保存文件。
2.使用CMake构建GKlib.lib
在metis/GKlib文件夹下新建一个独立的构建目录,命名为bulid(空文件夹),如下图所示。
打开终端,cd到该build文件夹,执行以下命令以生成构建文件:
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../install
如下图所示。
参数说明:
..
:表示 CMakeLists.txt 文件的路径在上一层目录。-DCMAKE_BUILD_TYPE=Release
:指定生成 Debug版本。-DCMAKE_INSTALL_PREFIX=../install
:指定安装目录。
在配置完成后,运行以下命令以编译库:
(保证前后都为Debug编译模式或都为Release编译模式)
cmake --build . --config Debug
编译完成后,生成的库文件会出现在build或指定的输出目录中,如下图所示。
3.确认子模块的构建
在metis的子目录的 CMakeLists.txt 中,应正确设置目标文件和依赖。例如,在include、libmetis(关键)、programs子目录中,可能需要明确链接 GKlib到metis库:
# Link GKlib to metis.
target_link_libraries(metis PRIVATE GKlib)
四、在VS上配置库路径
1.链接器 > 常规 > 附加库目录 (Linker > General > Additional Library Directories)
添加包含 GKlib.lib 的目录路径,如下图所示。
2.链接器 > 输入 > 附加依赖项 (Linker > Input > Additional Dependencies)
确认 GKlib.lib 是否在其中。如果缺失,手动添加,如下图所示。
在 Visual Studio 中选择 生成 (Build) > 清理解决方案 (Clean Solution),然后重新生成项目。
总结:
- 确保 GKlib 和 metis 主项目使用相同的构建配置(Debug 或 Release)。
- 在主项目中明确指定 GKlib 的库路径,区分 Debug 和 Release。
- 考虑使用 CMake 的子目录或配置导入功能来更好地管理库依赖。
欢迎交流🌹🌹