私はかなり小さな趣味のプロジェクトに入っています。ゲームを作っている、あるいは少なくともそうしようとしています...私たちが直面している主な問題は、 MacOSとLinuxではプロジェクトをコンパイルしますが、Windowsではコンパイルできません。ちょうどコンパイルされたものをリンクすることはできません
私たちはOpenGLのインターフェイスとしてGLFWを使用していますので、画面上に何かを表示させる必要があります。問題は、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のヒントはないという事実のため失敗しました。これに応じてこのファイルの名前を変更しても、プリコンパイルされたバイナリを置くことはできませんでした。このファイルを削除すると、再コンパイルと再表示が行われるため、どこにあるのかが分かりやすくなります。
もっと知的なリンカがあるかもしれないので、私はまたclangへの切り替えを試みましたが、最初は何もコンパイルしたくありませんでした。
私はこれに関する多くの研究を行いました。私は無数のSO回答と、同じまたは同じ問題を抱えた人々のフォーラムスレッドを見つけました。毎回異なるソリューションがあり、いずれも私たちのために働いていませんでした。
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のを使用しているMakefileを生成するには
重要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>
を、トン彼は、私たちのプロジェクト構造である:
CMakeLists.txtは上記であるあなたがあるモジュールの残りがGLFWを除いて、同じ方法で構築されている
/ソースで見る1
現時点では、私たちは多かれ少なかれ無力で解決策を探すのに飽きています。私たちはそれがうまくいくまでは試してみるが、巨大な混乱を招く決して存在してはならないすべてのもの、私たちは皆それがどのように終わるかを知っています... (c (咳)私たちの誰か(SO)が私たちよりも解決策を見つけるより良いアプローチをしてくれることを願っています。あなたが何かを見つけるのを助けるかもしれない何か他のものを自由に感じてください!
ありがとうございます!
の名前で:sDev
'CMakeLists.txt'には' add_subdirectory(graphicsengine) 'があります。 'add_subdirectory(glfw-3.2.1)'です。しかし、ビルドの順序は**逆になっています**: '構築されたターゲットのglfw'、'ビルドされたターゲットのグラフィックエンジン 'です。どのように可能ですか?そして、あなたが 'graphicsengine'フォルダを処理する時、' glfw'ターゲットは**アクセス不能**なので 'graphicsengine'と' glfw'をどのようにリンクしますか? – Tsyvarev
@Tsyvarev確かに奇妙ですが、ビルドの順序は 'target_link_libraries($ {PROJECT_NAME} graphicsengine fileSysネットワークゲーム)'と 'target_link_libraries($ PROJECT_NAME} glfw)' –
という行に実際に依存していると思います。私の2番目の質問はより重要です: 'graphicsengine'の下で、** glfwを使うライブラリをビルドします。しかし 'glfw'ライブラリは**後で**と書かれています。つまり、' graphicsengine'に 'glfw'ヘッダーを指定しなくてもいいということです。 'graphicsengine'はヘッダとリンクに**独自のglfw **を使うようです。そして、 "それ自身のglfw"はあなたのものと互換性がありません。 – Tsyvarev