7

ご迷惑をおかけしましたことをお詫び申し上げますが、cmakeのコンパイルに少し問題があります。

テスト実行可能ファイルの作成に使用しているCMakeLists.txtファイルと、共有ライブラリがあります。どちらも別のライブラリ(SFML)に依存しています。

MinGWでウィンドウにcmakeを使用しています。

私が構築しているlibの名前がsfmlのものと少し紛らわしいことは知っていますが、それはSFMLラッパーであるはずなので、これ以上の名前は見つかりませんでした。

ここにCMakeLists.txtがあります

cmake_minimum_required(VERSION 2.6)
project(projectName)

set(EXECUTABLE_NAME testSFML)
set(LIBRARY_NAME    SFMLwindow)

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin/)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include /
${CMAKE_CURRENT_SOURCE_DIR}/../../include
)

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../lib/)

file(
    GLOB_RECURSE
    SRC_FILES
    src/*
)

file(
    GLOB_RECURSE
    INCLUDE_FILES
    include/*
)

add_executable(
${EXECUTABLE_NAME}
main.cpp
${SRC_FILES}
${INCLUDE_FILES}
)

target_link_libraries(
    ${EXECUTABLE_NAME}
    sfml-main
    sfml-system
    sfml-window
)


add_library(
${LIBRARY_NAME}
SHARED
${SRC_FILES}
)

そして、私がターミナルで得るもの:

"C:\MinGW\bin\mingw32-make.exe" 
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/iksemel/docs/WorkBench/programming/projets/TestSFML/cmake
Linking CXX shared library libSFMLwindow.dll
Creating library file: libSFMLwindow.dll.a
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x59):undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0xda): undefined reference to `_imp___ZN2sf6WindowC1ENS_9VideoModeERKSsjRKNS_15ContextSettingsE'
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x163): undefined reference to `_imp___ZN2sf6Window5closeEv'
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x1bd): undefined reference to `_imp___ZN2sf6Window9pollEventERNS_5EventE'
CMakeFiles\SFMLwindow.dir/objects.a(SFMLWindow.cpp.obj):SFMLWindow.cpp:(.text+0x1d8): undefined reference to `_imp___ZN2sf6Window7displayEv'
collect2: ld a retourné 1 code d'état d'exécution
mingw32-make.exe[2]: *** [libSFMLwindow.dll] Error 1
mingw32-make.exe[1]: *** [CMakeFiles/SFMLwindow.dir/all] Error 2
mingw32-make.exe: *** [all] Error 2

誰かが何が起こっているのかについての手がかりを持っているなら、私は非常に感謝しています!

4

1 に答える 1

14

推測では、SFMLwindowライブラリはsfml-main、sfml-system、sfml-windowの一部またはすべてにリンクされている必要があります。

CMakeLists.txtの末尾を次のように変更してみてください。

add_library(
    ${LIBRARY_NAME}
    SHARED
    ${SRC_FILES}
    ${INCLUDE_FILES}
)

add_executable(
    ${EXECUTABLE_NAME}
    main.cpp
)

target_link_libraries(
    ${LIBRARY_NAME}
    sfml-main
    sfml-system
    sfml-window
)

target_link_libraries(
    ${EXECUTABLE_NAME}
    ${LIBRARY_NAME}
)


余談ですfile(GLOB_RECURSE...が、一般的に、情報源のリストを収集する方法として眉をひそめています。のドキュメントからfile

ソースツリーからソースファイルのリストを収集するためにGLOBを使用することはお勧めしません。ソースが追加または削除されたときにCMakeLists.txtファイルが変更されない場合、生成されたビルドシステムは、CMakeに再生成を要求するタイミングを認識できません。


また、この場合find_libraryよりも優先されるべきです。link_directoriesのドキュメントからlink_directories

このコマンドが必要になることはめったにないことに注意してください。find_package()およびfind_library()によって返されるライブラリの場所は、絶対パスです。これらの絶対ライブラリファイルパスをtarget_link_libraries()コマンドに直接渡します。CMakeは、リンカーがそれらを確実に検出するようにします。

于 2012-06-27T01:51:53.670 に答える