首页 > 解决方案 > 使用来自不同头文件 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 进行这项工作?非常感谢您的帮助。

标签: c++c++11cmake

解决方案


通过将包含文件也添加到 add_library 中,我解决了类似的问题:

add_library(草grass.cpp草.h)

试试这个,看看它是否有效


推荐阅读