首页 > 解决方案 > C++ 构造函数未定义

问题描述

我从事 C++ 项目,我使用 CMake 来构建我的文件。我的构建失败原因

未定义对“Software::Software()”的引用

,但我没有看到问题。如果您有想法,请不要犹豫,谢谢

文件架构:

在此处输入图像描述

制作:

# cmake_minimum_required(VERSION <specify CMake version here>)
project(untitled)

cmake_minimum_required(VERSION 2.8.9)
set(CMAKE_CXX_STANDARD 11)

include_directories(include)

file(GLOB SOURCES "src/*.cpp")
add_executable(untitled ${SOURCES})

软件.h:

#include <string>
class Software{
    private : 
        std::string name;

    public :
        Software();
}

软件.cpp:

#include "Software.h"

Software::Software() {
    this->name = "defaultName";
}

SoftwaresConfigurations.h(调用软件的构造函数):

#include "Software.h"

class SoftwaresConfigurations {
    public:
        SoftwaresConfigurations();
}

软件配置.cpp:

#include "SoftwaresConfigurations.h"

SoftwaresConfigurations::SoftwaresConfigurations(){
    Software software = Software();
}

标签: c++cmake

解决方案


你掉进了那个陷阱FILE(GLOB ...)。重新运行 CMake 应该可以解决此问题,但您可能应该不再使用 GLOB 来收集源文件。例如,您可以如下明确列出它们:

set(SOURCES src/main.cpp src/Softwares.cpp src/SoftwaresConfigurations.cpp)

我将在下面解释发生了什么。

官方文档是这样说的:

我们不建议使用 GLOB 从源代码树中收集源文件列表。如果添加或删除源时没有 CMakeLists.txt 文件更改,则生成的构建系统无法知道何时要求 CMake 重新生成。

所以可能发生的事情是您只用一个源文件创建了项目。CMakeGLOB在配置时运行并仅找到一个 .cpp 文件。#include然后,您添加了两个文件(CMake 不知道)并将SoftwaresConfiguration.cpp. 这会触发重建。但是,由于 CMake 不知道Softwares.cpp,它不会构建该文件,并且链接器会生成未引用的符号。


推荐阅读