c++ - 使用来自不同头文件 C++ 和 CMake 的类和函数
问题描述
我正在波恩大学的一门课程中学习现代 C++。我在文件中声明了一个类,grass.h
并在相应grass.cpp
文件中声明了它的实现。同样在另一个tools.h
-tools.cpp
声明 - 实现对是一个函数,它接受对上面定义的类对象的引用。最后,一个main.cpp
文件从第一对初始化一个 Grass 对象,并将其从第二对传递给函数。我能够main.cpp
从这些命令行指令编译并获得所需的输出:
c++ -std=c++11 -g -c grass.cpp -o grass.o
c++ -std=c++11 -g -c tools.cpp -o tools.o
c++ -std=c++11 -g main.cpp grass.o tools.o -o main
但无法使用 CMake 这样做。我不知道命令行指令叫什么(链接和编译?)。
这是代码示例“grass.h”:
#include <string>
#pragma once
class Grass
{
private:
int green_;
std::string name_;
public:
Grass(int green, std::string name): green_{green}, name_{name} {}
int get_green() const; // getter functions for
const std::string& get_green_name() const; // both private members
};
这些函数只返回值并在“grass.cpp”中实现。
然后我有一个“tools.h”:
#include <iostream>
#include "grass.h"
#pragma once
void PrintGrass(Grass& grObj);
而这个函数只是打印来自 Grass 的 getter 函数的值。
最后,main.cpp 包含:
int main ()
{
Grass grObj{10, "ABC"};
PrintGrass(grObj);
cout << endl;
return 0;
}
CMake 错误发生在 100% Linking CXX executable main. 错误在 tools.cpp:
undefined reference to `Grass::get_green_name[abi:cxx11]()'
和
undefined reference to `Grass::get_green()'
. 这意味着程序无法找到这些函数的定义,对吧?CMake 文件如下所示:
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS "-Wall")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
add_library(grass grass.cpp)
add_library(tools tools.cpp)
add_executable(main main.cpp)
target_link_libraries(main grass tools)
如何使用 CMake 进行这项工作?非常感谢您的帮助。
解决方案
通过将包含文件也添加到 add_library 中,我解决了类似的问题:
add_library(草grass.cpp草.h)
试试这个,看看它是否有效
推荐阅读
- html - 如何获得三个按钮(1x 左和 2x 右),然后在下方获得更多?
- android - 在相机中拍摄图像后 onActivityResult 出错
- java - 如何在没有身份验证的情况下从微服务 B 向微服务 A 进行 API 调用
- android - 如何将通知从一个设备发送到多个设备 Firebase?
- php - 尝试为 laravel 安装 vanilo 电子商务时,yarn install 抛出错误
- javascript - 如何在 HTML 中修复此错误(未显示错误)
- javascript - 表达 res.redirect 导致“Uncaught SyntaxError: Unexpected token <”
- c++ - 在函数中使用非静态值作为默认参数
- android - 如何通过音频焦点处理使 YouTube 视频静音并且不中断音乐播放?
- java - Rabbitmq java客户端消费者handleDelivery方法没有被调用