如何配置CMakeLists.txt进行C ++项目?

时间:2013-11-19 06:52:52

标签: c++ cmake

我目前正在尝试自学cmake,当我运行make时遇到错误,但是当我自己编译文件时程序运行得很好。在我的项目中,我有2个头文件声明类Card和DeckOfCards,2 .cpp文件定义我的类,以及.cpp驱动程序main.cpp。

我试过在线查看如何正确使用cmake,但我找不到很多。

以下是我在CMakeLists.txt中的内容......

cmake_minimum_required(VERSION 2.8.7)
project(Assignment_8)
add_library(card Card.h Card.cpp)
add_library(deckofcards DeckOfCards.h DeckOfCards.cpp)
add_executable(card_class_driver main.cpp)
target_link_libraries(card_class_driver card)
target_link_libraries(card_class_driver deckofcards)

在'target_link_libraries'上,如果你愿意的话,我也尝试了一个'声明',并得到相同的错误,就像这样..

target_link_libraries(card_class_driver card deckofcards)

我有一个名为'assignment_8'的目录中的源文件,以及一个子目录/ build目录'_build'...我读过的方式,并且一直在尝试它,在子目录'_build'我已经一直在运行“cmake ..”...那里的一切都很好..它说它检测到了一切......但是当我运行'make'时,我得到了这些错误......

Scanning dependencies of target card
[ 33%] Building CXX object CMakeFiles/card.dir/Card.cpp.o
Linking CXX static library libcard.a
[ 33%] Built target card
Scanning dependencies of target deckofcards
[ 66%] Building CXX object CMakeFiles/deckofcards.dir/DeckOfCards.cpp.o
Linking CXX static library libdeckofcards.a
[ 66%] Built target deckofcards
Scanning dependencies of target card_class_driver
[100%] Building CXX object CMakeFiles/card_class_driver.dir/main.cpp.o
Linking CXX executable card_class_driver
libdeckofcards.a(DeckOfCards.cpp.o): In function `DeckOfCards::DeckOfCards()':
DeckOfCards.cpp:(.text+0x49): undefined reference to `Card::Card(int, int)'
libdeckofcards.a(DeckOfCards.cpp.o): In function `DeckOfCards::print_deck() const':
DeckOfCards.cpp:(.text+0x238): undefined reference to `Card::print_card() const'
collect2: error: ld returned 1 exit status
make[2]: *** [card_class_driver] Error 1
make[1]: *** [CMakeFiles/card_class_driver.dir/all] Error 2
make: *** [all] Error 2

非常感谢任何帮助

1 个答案:

答案 0 :(得分:5)

您的图书馆似乎没有提到任何依赖。

您的deckofcards库使用card库中的内容。你需要告诉CMake,否则它将无法正确链接你的程序。正确的方法是将CMakeLists的最后两行更改为

target_link_libraries(deckofcards card)
target_link_libraries(card_class_driver deckofcards)

请注意,您不需要在最后一行再次指定card库。在这种情况下,CMake会自动解决传递依赖关系:由于deckofcards取决于card,因此使用前者的所有内容也将与后者相关联。