我正在尝试在我的游戏中开始使用 GUI 库 Noesis,目前正在将其集成到我的项目中。不幸的是,在链接过程中,到目前为止我使用的所有 Noesis 函数都显示“未定义引用”例如:
[0/1] Re-running CMake...
--
-- Configuring done (0.3s)
-- Generating done (0.1s)
-- Build files have been written to: C:/projects/Curse of Elliah/cmake-build-debug
[1/2] Linking CXX executable Curse_of_Elliah.exe
FAILED: Curse_of_Elliah.exe
C:\WINDOWS\system32\cmd.exe /C "cd . && C:\Users\wilto\AppData\Local\Programs\CLion\bin\mingw\bin\g++.exe -g @CMakeFiles\Curse_of_Elliah.rsp -o Curse_of_Elliah.exe -Wl,--out-implib,libCurse_of_Elliah.dll.a -Wl,--major-image-version,0,--minor-image-version,0 && cd ."
C:\Users\wilto\AppData\Local\Programs\CLion\bin\mingw\bin/ld.exe: CMakeFiles/Curse_of_Elliah.dir/libs/Noesis/NoesisGL/GLRenderDevice.cpp.obj: in function `NoesisApp::GLRenderDevice::GLRenderDevice(bool)':
C:/projects/Curse of Elliah/libs/Noesis/NoesisGL/GLRenderDevice.cpp:154: undefined reference to `Noesis::RenderDevice::RenderDevice()'
Noesis 是一个预构建的静态库,其中包括头文件 (.h),以及 .lib 文件和 .dll 文件。不知何故,无法访问 .dll 文件中的定义,我搜索了互联网以寻找解决方案,并尝试了许多不同的方法,但似乎没有任何改变。
在 Noesis 集成教程中,它是这样说的:
/Bin: this is the directory where dynamic libraries, one folder per architecture, can be found. Your executable must be able to reach this path. The easiest way is by copying it here in a post-build step.
/Include: directory for public headers. You must add this path to the Additional Include Directories of your project
/Lib: object libraries to link against with are stored in this directory, one folder per architecture. You must add this path to you Additional Libraries Directory and also link with the corresponding library.
因此,我将标头放入项目的 lib 文件夹中,使用它们没有问题,因为我刚刚将其包含在 CMake 中。然后,我将 .lib 文件放入我的 libs 文件夹中的另一个子文件夹中:libs/Noesis/Lib/windows_x86_64/Noesis.lib,我已将此路径与 target_link_libraries 一起以多种不同方式使用,并已验证 CMake 能够通过消息 (STATUS) 访问该文件。然后是 .dll 文件。我已将 dll 文件放入 lib 的另一个子文件夹中,并将其所在的子文件夹添加到 Windows 中的环境变量中。这似乎没有任何作用。我还将 .dll 文件放在构建文件夹 cmake-build-debug 中。我试图将它放在该位置内的多个不同子文件夹中,但即使它位于 .exe 文件旁边,也没有任何变化。
我尝试将其像包含普通库一样包含,使用 include_directories 和 target_link_libraries 尽可能简单。我尝试使用 add_library:
add_library(noesis SHARED IMPORTED)
set_target_properties(noesis PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/libs/Noesis"
IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/libs/Noesis/Bin/windows_x86_64/Noesis.dll"
IMPORTED_IMPLIB "${PROJECT_SOURCE_DIR}/libs/Noesis/Lib/windows_x86_64/Noesis.lib"
#INTERFACE_LINK_LIBRARIES "\$<LINK_ONLY:gdi32>"
)
以这两种方式并将 IMPORTED_LOCATION 更改为 .lib 文件并省略 IMPORTED_IMPLIB。这也不起作用。我想知道我是否做错了什么,以及导入静态预构建库的实际正确方法是什么?我也没有真正得到 Noesis 方面的任何官方支持,因为他们不支持 CMake。我花了一整天时间来解决这个简单的问题,我觉得我已经没有选择了。
编辑:我使用 MSVC 和 Visual Studio 2022 生成器仅使用 Noesis 创建了一个最小项目。这是我的 cmake 代码:
cmake_minimum_required(VERSION 3.29)
project(untitled)
set(CMAKE_CXX_STANDARD 23)
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/libs/Noesis")
link_directories("${CMAKE_CURRENT_SOURCE_DIR}/libs/Noesis/Bin/windows_x86_64")
add_library(noesis SHARED IMPORTED)
set_target_properties(noesis PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/libs/Noesis"
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/libs/Noesis/Bin/windows_x86_64/Noesis.dll"
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/libs/Noesis/Lib/windows_x86_64/Noesis.lib"
#INTERFACE_LINK_LIBRARIES "\$<LINK_ONLY:gdi32>"
)
add_executable(untitled main.cpp)
target_link_libraries (untitled ${noesis})
这是我的结构:
无标题
- cmake-build-调试
- 库
- 诺西斯
- 箱体-windows_x86_64
- 诺西斯
- 库——windows_x86_64
- Noesis 库
- Noesis 头文件
- CMake列表.txt
- 主程序
不幸的是,我仍然遇到同样的问题,其中显示:
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl Noesis::Init(void)" (__imp_?Init@Noesis@@YAXXZ) referenced in function main [C:\projects\untitled\cmake-build-debug\untitled.vcxproj]
C:\projects\untitled\cmake-build-debug\Debug\untitled.exe : fatal error LNK1120: 1 unresolved externals [C:\projects\untitled\cmake-build-debug\untitled.vcxproj]
编辑2:
实际上,我很笨。我在 target_link_libraries 中将 ${noesis} 更改为 noesis,现在它显示进程已完成,退出代码为 -1073741515 (0xC0000135)。这似乎是因为 .exe 找不到 .dll。我想我已经将 Noesis.dll 放在 .exe 旁边,但我可能需要做一些测试
编辑 3:实际上,我设法让它工作了!MSVC 只是将 .exe 放在子文件夹中!