c++ - 如何配置CMakeLists.txt来制作C++项目?

标签 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”中一直在运行“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

任何帮助将不胜感激

最佳答案

您的库之间似乎存在未提及的依赖关系。

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

target_link_libraries(deckofcards card)
target_link_libraries(card_class_driver deckofcards)

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

关于c++ - 如何配置CMakeLists.txt来制作C++项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20065072/

相关文章:

c++ - Github Actions 中的 Cmake 和 PugiXML

android - TravisCI 中的 NDK、CMake 和 Android

c++ - 有没有办法从仿函数中提取第一个参数的类型?

c++ - 修剪空格 C++ POINTERS

linux - 为 AWS-Lambda : GLIBC issues 编译 pdftohtml 二进制文件

ubuntu - 如何从源代码为 CMake 构建 .deb 文件?

java-native-interface - 如何在 cmake 上使用 FIND_JNI

c++ - Boost Serialization - 导出多个 CPP 文件

c++ - 分解后的成员函数名称中的返回类型

c++ - 我可以将 QQuickFramebufferObject 的背景设置为透明吗?