3

次の構造のプロジェクトがあります

  /cmake_modules/
    FindSFML.cmake
  /includes/
    car.hpp
    motor.hpp
    tires.hpp
  /sources/
    car.cpp
    motor.cpp
    tires.cpp    
  /main.cpp
  /main.hpp

次のCMakeFiles.txtファイルがあります。

cmake_minimum_required(VERSION 2.8)

project (MYGAME)
set (MYGAME_VERSION_MAJOR 1)
set (MYGAME_VERSION_MINOR 0)

set (EXECUTABLE_NAME "mygame")

include_directories ("${MYGAME_BINARY_DIR}")
include_directories ("${MYGAME_BINARY_DIR}/includes")
link_directories ("${MYGAME_BINARY_DIR}/sources")

add_executable(${EXECUTABLE_NAME} main.cpp)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})
find_package(SFML 2.0 REQUIRED system window graphics network audio)

target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES})

実行しようとすると、次のようmakeになります。

[100%] Building CXX object CMakeFiles/mygame.dir/main.cpp.o
Linking CXX executable mygame
CMakeFiles/mygame.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x11): undefined reference to `mynamespace::Car::Instance()'
main.cpp:(.text+0x21): undefined reference to `mynamespace::Car::start()'
collect2: error: ld returned 1 exit status
make[2]: *** [mygame] Error 1
make[1]: *** [CMakeFiles/mygame.dir/all] Error 2
make: *** [all] Error 2

どうすれば修正できますか?

4

1 に答える 1

5

何らかの方法で、残りのソース (car.cpp、motor.cpp、および Tires.cpp) をビルドに含める必要があります。

実行可能ファイルに main.cpp と一緒に直接追加することもできます。

set(MySources sources/car.cpp sources/motor.cpp sources/tires.cpp main.cpp)
add_executable(${EXECUTABLE_NAME} ${MySources})

または、これらをライブラリにしてリンクすることができます:

set(MyLibSources sources/car.cpp sources/motor.cpp sources/tires.cpp)
add_library(MyLib ${MyLibSources})
add_executable(${EXECUTABLE_NAME} main.cpp)
...
target_link_libraries(${EXECUTABLE_NAME} MyLib ${SFML_LIBRARIES})

その他の注意点:

可能な場合は の使用を避ける必要がありますlink_directories(独自のドキュメントでは使用が推奨されていません)。また、add_executableまたはを介し​​て追加されたファイルのリストにヘッダーを含めると、 add_libraryMS Visual Studio などの IDE に表示されるため、多くの場合に役立ちます。

于 2013-04-27T00:09:09.130 に答える