首页 文章

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

提问于
浏览
4

我目前正在尝试自学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 回答

  • 5

    您的库之间似乎没有未提及的依赖关系 .

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

    target_link_libraries(deckofcards card)
    target_link_libraries(card_class_driver deckofcards)
    

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

相关问题