2017-05-29 84 views
1

我在一个相当小爱好的项目,我们正在创造一个游戏,或者至少试图这样做......我们所面临的主要问题是,我们能在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)可能必须找到比我们的解决方案更好的办法嘛?(咳嗽)。随意问任何可能会帮助你找到有效的东西!

在此先感谢!

在名称:发展局局长

+1

在你的'CMakeLists.txt'中,你有'add_subdirectory(graphicsengine)',那么'add_subdirectory(GLFW-3.2.1)'。但是构建顺序是**反转**:'构建目标glfw',然后'构建目标graphicsengine'。这怎么可能?你怎么把'graphicsengine'和'glfw'联系起来,因为在你处理'graphicsengine'文件夹时'glfw'目标是**不可访问的**? – Tsyvarev

+0

@Tsyvarev的确很奇怪,但我认为构建顺序实际上取决于'target_link_libraries($ {PROJECT_NAME} graphicsengine fileSys网络游戏)'这一行,然后才在'target_link_libraries($ {PROJECT_NAME} glfw)' –

+0

这一行开始。 ,我的第二个问题更重要:在'graphicsengine'下建立库,**使用**'glfw'。但'glfw'库在**后期被注明,这意味着你甚至不会为'graphicsengine'提供'glfw'头文件。它看起来像'graphicsengine'使用**自己的glfw **标题和链接。和“它自己的glfw”与你的不兼容。 – Tsyvarev

回答

0

我们找到了!

这个问题实际上是我们graphics.hpp

我们有行#define GLFW_DLL

这是错误的,因为它必须

#define GLFW_STATIC

而现在它的工作原理