使用来自不同头文件C ++和CMake的类和函数

如何解决使用来自不同头文件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%链接CXX可执行主文件上。错误在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 grass.h)

尝试一下,看看是否有效

,

我将总结注释部分,并根据@pptaszni的建议将整个代码和详细错误放在此处:
完整代码(依依顺序):

  1. grass.hgrass.cpp
#include <string>
#pragma once

class Grass
{
public:
    Grass(int green,std::string name): green_{green},name_{name} {}

    int get_green ();
    std::string get_green_name ();
private:
    int green_ = 100;
    std::string name_ = "Joe";
};

#include "grass.h"

Grass::Grass(int green,name_{name}{}

int Grass::get_green() {
    return green_;  
}

std::string Grass::get_green_name() { 
    return name_;
}
  1. tools.htools.cpp
#include <iostream>
#include "grass.h"

#pragma once

void PrintGrass(Grass& grObj);

#include <iostream>
#include "grass.h"
#include "tools.h"

void PrintGrass(Grass& grObj)
{
    std::cout << grObj.get_green_name() << "," << grObj.get_green() << " ";
}
  1. main.cpp
#include <iostream>
#include "grass.h"
#include "tools.h"
#include <string>

using std::string;
using std::cout;
using std::endl;


int main ()
{
    Grass grObj{10,"Jane"};
    PrintGrass(grObj);
    cout << endl;
    return 0;
}
  1. CMakeLists.txt
project(Grasses)
cmake_minimum_required(VERSION 3.0)
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)

make VERBOSE=1的错误output详细,已粘贴到Github Gist中,以使该帖子的长度不超过其已有时间。

摘要
什么有效?写作

target_link_libraries(main tools grass)

代替

target_link_libraries(main grass tools).

@Yksisarvinen给出的解释中要带走的信息是,始终在最后放置没有任何依赖关系的库。这是因为,如果编译器在处理它们时没有发现任何用途,则可能会查看这些库并将其丢弃。

另一种可行的方法是仅使用add_executable(main main.cpp grass.cpp tools.cpp)而不添加库,然后再链接它们。这是@molbdnilo和@Yksisarvinen提出的。

谢谢大家帮助我更好地理解C ++。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res