让无法链接的东西,它确实只是编译
我在一个相当小爱好的项目,我们正在创造一个游戏,或者至少试图这样做......我们所面临的主要问题是,我们能在MacOS和Linux上编译项目,但不能在Windows上编译。让无法链接的东西,它确实只是编译
我们正在使用GLFW作为OpenGL的一个接口,所以让我们获得任何东西在屏幕上可见它是必需的。问题是,当我们告诉Make做它的事情时,它会编译每个单独的模块,但由于未定义的引用而无法链接它们。虽然这可能是有道理的奇怪的是,这些未知的引用都有前缀__imp_
,这是不存在的来源。示例:我们使用方法glfwInit
,但试图进行该项目时,我们得到:graphicsengine/libgraphicsengine.a(graphics.cpp.obj):graphics.cpp:(.text+0xa): undefined reference to `_imp__glfwInit'
做了一些研究后,我发现This SO Question其中我试过了答案。它失败了,因为编译后的唯一lib是libglfw3.a
,在dll上没有任何类型的dll或提示。相应地重命名这个文件没有帮助,放置预编译的二进制文件也没有帮助。删除这个文件导致它重新编译并重新出现,所以清楚地知道它在哪里。
我们也尝试切换到铛因为也许它有一个更智能的连接,但它并没有要编译摆在首位什么。
我进行了大量的研究这一点,我发现无数的SO答案和人类似甚至相同的问题论坛主题,每一个都有不同的解决方案,他们没有为我们工作。
要生成我们使用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是一个完整的日志/做出一个自定义生成脚本调用:
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>
如果你想知道,T他是我们的项目结构:
以上的CMakeLists.txt是你/源
模块的其余部分是建立在以同样的方式,除了GLFW,这是看到了一个可以在他们的网站上找到的那个
在这个时候,我们或多或少无助地厌倦了寻找解决方案,我们只是尝试东西,直到它发挥作用,但结果是一个巨大的混乱我们都知道如何结束...... (c ough)这些分支是一个在那里我做了,使得它做其他的事情,我们希望你们中的一些(SO)可能必须找到比我们的解决方案更好的办法嘛?(咳嗽)。随意问任何可能会帮助你找到有效的东西!
在此先感谢!
在名称:发展局局长
我们找到了!
这个问题实际上是我们graphics.hpp
:
我们有行#define GLFW_DLL
这是错误的,因为它必须
#define GLFW_STATIC
而现在它的工作原理
在你的'CMakeLists.txt'中,你有'add_subdirectory(graphicsengine)',那么'add_subdirectory(GLFW-3.2.1)'。但是构建顺序是**反转**:'构建目标glfw',然后'构建目标graphicsengine'。这怎么可能?你怎么把'graphicsengine'和'glfw'联系起来,因为在你处理'graphicsengine'文件夹时'glfw'目标是**不可访问的**? – Tsyvarev
@Tsyvarev的确很奇怪,但我认为构建顺序实际上取决于'target_link_libraries($ {PROJECT_NAME} graphicsengine fileSys网络游戏)'这一行,然后才在'target_link_libraries($ {PROJECT_NAME} glfw)' –
这一行开始。 ,我的第二个问题更重要:在'graphicsengine'下建立库,**使用**'glfw'。但'glfw'库在**后期被注明,这意味着你甚至不会为'graphicsengine'提供'glfw'头文件。它看起来像'graphicsengine'使用**自己的glfw **标题和链接。和“它自己的glfw”与你的不兼容。 – Tsyvarev