我目前正在尝试自学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
非常感谢任何帮助
答案 0 :(得分:5)
您的图书馆似乎没有提到任何依赖。
您的deckofcards
库使用card
库中的内容。你需要告诉CMake,否则它将无法正确链接你的程序。正确的方法是将CMakeLists的最后两行更改为
target_link_libraries(deckofcards card)
target_link_libraries(card_class_driver deckofcards)
请注意,您不需要在最后一行再次指定card
库。在这种情况下,CMake会自动解决传递依赖关系:由于deckofcards
取决于card
,因此使用前者的所有内容也将与后者相关联。