c++ - 无法链接它刚刚编译的东西

标签 c++ cmake mingw ld

我在一个相当小的爱好项目中,我们正在创建一个游戏,或者至少尝试这样做......我们面临的主要问题是我们能够在 MacOS 和 Linux 上编译该项目,但不是在 Windows 上。

我们使用 GLFW 作为 OpenGL 的接口(interface),因此我们需要它才能在屏幕上显示任何内容。问题是,当我们告诉 Make 做它的事情时,它会编译每个单独的模块,但由于 undefined reference 而无法链接它们。虽然这可能有道理,但奇怪的是这些未知引用都有前缀 __imp_,源代码中没有。示例:我们使用方法 glfwInit 但在尝试创建项目时我们得到:graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0xa) : 对 _imp__glfwInit 的 undefined reference

我做了一些研究后发现 This SO Question其中我尝试了答案。它失败了,因为编译后唯一的库是 libglfw3.a,没有任何类型的 dll 或 dll 提示。相应地重命名此文件没有帮助,放置预编译的二进制文件也没有帮助。删除此文件会导致它重新编译并重新出现,因此清楚地知道它在哪里。

我们还尝试切换到 clang,因为它可能有一个更智能的链接器,但它一开始不想编译任何东西。

我对此进行了大量研究,发现了无数 SO 答案和论坛主题,人们有类似甚至相同的问题,每个人都有不同的解决方案,但没有一个对我们有用。

为了生成 Makefile,我们在主子目录中使用 CMake 和以下脚本(别担心,它是从上面调用的,到目前为止我们已经成功了):

set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(GLFW_INSTALL OFF CACHE BOOL "" FORCE)

add_subdirectory(graphicsengine)
add_subdirectory(fileSys)
add_subdirectory(networking)
add_subdirectory(game)

add_subdirectory(glfw-3.2.1)
include_directories(glfw-3.2.1/include)

if (UNIX AND NOT APPLE)  
   find_package(OpenGL REQUIRED)
   include_directories(${OPENGL_INCLUDE_DIR})
endif()

add_executable(${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp")

 target_link_libraries(${PROJECT_NAME} graphicsengine fileSys networking game)

if (APPLE)
   target_link_libraries(${PROJECT_NAME} "-framework OpenGL")
endif()
if (WIN32)
   target_link_libraries(${PROJECT_NAME} opengl32 gdi32)
endif()
if (UNIX AND NOT APPLE)  
   target_link_libraries(${PROJECT_NAME} ${OPENGL_gl_LIBRARY})
endif()

target_link_libraries(${PROJECT_NAME} glfw)

install(TARGETS ${PROJECT_NAME} DESTINATION ${INSTALL_DIR})

其余重要的 cmake 调用都在父目录中

这是自定义构建脚本调用的 cmake/make 的完整日志:

debug
release
-- The CXX compiler identification is GNU 5.3.0
-- Check for working CXX compiler: D:/MinGW/bin/g++.exe
-- Check for working CXX compiler: D:/MinGW/bin/g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- The C compiler identification is GNU 5.3.0
-- Check for working C compiler: D:/MinGW/bin/gcc.exe
-- Check for working C compiler: D:/MinGW/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Could NOT find Vulkan (missing:  VULKAN_INCLUDE_DIR)
-- Looking for dinput.h
-- Looking for dinput.h - not found
-- Looking for xinput.h
-- Looking for xinput.h - not found
-- Performing Test _GLFW_HAS_DEP
-- Performing Test _GLFW_HAS_DEP - Success
-- Performing Test _GLFW_HAS_ASLR
-- Performing Test _GLFW_HAS_ASLR - Success
-- Performing Test _GLFW_HAS_64ASLR
-- Performing Test _GLFW_HAS_64ASLR - Failed
-- Using Win32 for window creation
-- Configuring done
-- Generating done
-- Build files have been written to: D:/cpp-neon/Workspace/Supermerged
--------------MAKE STARTS HERE--------------
[ 60%] Built target glfw
[ 68%] Built target graphicsengine
[ 76%] Built target fileSys
[ 84%] Built target networking
[ 92%] Built target game
[ 96%] Linking CXX executable Submerged_PR0.exe
graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0xa): undefined reference to `_imp__glfwInit'
graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0x45): undefined reference to `_imp__glfwCreateWindow'
graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0x55): undefined reference to `_imp__glfwTerminate'
graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0x64): undefined reference to `_imp__glfwMakeContextCurrent'
graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0x71): undefined reference to `_imp__glfwWindowShouldClose'
graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0x98): undefined reference to `_imp__glfwSwapBuffers'
graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0x9f): undefined reference to `_imp__glfwPollEvents'
graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0xa8): undefined reference to `_imp__glfwTerminate'
collect2.exe: error: ld returned 1 exit status
source\CMakeFiles\Submerged_PR0.dir\build.make:101: recipe for target 'source/Submerged_PR0.exe' failed
mingw32-make[2]: *** [source/Submerged_PR0.exe] Error 1
CMakeFiles\Makefile2:102: recipe for target 'source/CMakeFiles/Submerged_PR0.dir/all' failed
mingw32-make[1]: *** [source/CMakeFiles/Submerged_PR0.dir/all] Error 2
Makefile:128: recipe for target 'all' failed
mingw32-make: *** [all] Error 2
Make Failed, Aborting Install
PS D:\cpp-neon\Workspace\Supermerged>

如果您想知道,这是我们的项目结构:

上面的 CMakeLists.txt 就是你在/source 中看到的那个

除了 glfw 之外,其他模块都是以相同的方式构建的,您可以在他们的网站上找到它

在这个时间点,我们或多或少地无助和厌倦了寻找解决方案,在我们只是尝试一些东西直到它有点起作用但最终却把本不应该存在的一切搞得一团糟的时候,我们所有人都知道结果如何......(咳嗽)这些分支中的哪一个是我做的事情让它做另一件事的地方?(咳嗽)我们希望你们中的一些人(所以) 可能比我们任何人都有更好的方法来找到解决方案。随意询问任何可能有助于您找到有用的东西的其他问题!

提前致谢!

以:sDev 的名义

最佳答案

我们找到了!

问题实际上出在我们的 graphics.hpp 中:

我们有行 #define GLFW_DLL

这是错误的,因为它必须是

#define GLFW_STATIC

现在可以了

关于c++ - 无法链接它刚刚编译的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246608/

相关文章:

c++ - 代码抛出段错误

c++ - 如何在不调用对象构造函数的情况下声明对象数组

c++ - 如何将 Qt Action 与函数连接

c++ - 在 CLion 中使用 freeglut 在 OpenGL 中链接错误

MinGW - 将 GCC 版本 3.4.5 更新到版本 4.4

c++ - 基类和派生类中的模板成员之间的重载解析

linux - 我怎样才能让 CMake 找到我的替代 Boost 安装?

c++ - 链接时突然收到 maxrregcount 警告和 undefined reference 错误

macos - 在 OSX 上使用 CMake 将项目与 GLFW3 链接时出现 undefined symbol

c++ - 似乎无法在 Eclipse 上构建 Qt 项目(C++、Windows)