新手

2013-04-26 28 views
2

我有以下結構的項目創建一個CMakeFiles.txt新手

/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

您需要以某種方式在構建中包含其餘源代碼(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(它自己的文檔不鼓勵使用它),並且將頭文件包含在文件列表中通常很有幫助s通過add_executableadd_library添加,因爲這些會在MS Visual Studio等IDE中顯示出來。

+0

我已經刪除'link_directories'添加了'set(MyLib car.cpp ..)'和'add_library',但現在我得到一個錯誤找不到源文件car.cpp – rkmax 2013-04-27 00:20:37

+0

對不起 - 我修正了這些例子。您需要在源文件的相對路徑中包含「sources」目錄。 – Fraser 2013-04-27 00:33:24

+0

存在某種方式來包含'sources/*。cpp'? – rkmax 2013-04-27 00:35:18