c++ - 获取 "undefined reference to"

标签 c++ cmake undefined-reference

我尝试了几种方法来解决这个问题,但我显然无法理解 CMake...

下面基本上就是整个项目:

.
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    ├── main.cpp
    ├── SubwordEncoder.cpp
    └── SubwordEncoder.h

第一个(./CMakeLists.txt)包含:

    cmake_minimum_required(VERSION 3.5)
    project(xlib)
    set(CMAKE_CXX_STANDARD 11)        
    add_subdirectory(./src)        
    add_executable(main src/main.cpp)

和第二个(src/MakeLists.txt)

file(GLOB_RECURSE xlib_SOURCES "*.cpp")
file(GLOB_RECURSE xlib_SURCES "*.h")

main.cpp 只包含这个:

#include <string>
#include <iostream>
#include <stdio.h>
#include "SubwordEncoder.h"

int main() {
    std::cout << "Hello World!" << std::endl;
    auto encoder = new SubwordEncoder();

    auto encoded = encoder->encode("Hello World!");

    for (auto i : encoded) {
        std::cout << i << std::endl;
    }

    return 0;
}

SubwordEncoder.h

#ifndef XLIB_SUBWORDENCODER_H
#define XLIB_SUBWORDENCODER_H

#include <string>
#include <vector>

class SubwordEncoder {
public:
    std::vector<int> encode(std::string decoded);
};

#endif //XLIB_SUBWORDENCODER_H

SubwordEncoder.cpp

#include "SubwordEncoder.h"

std::vector<int> SubwordEncoder::encode(std::string decoded) {
    std::vector<int> vect;
    vect.push_back(10);
    vect.push_back(20);
    vect.push_back(30);
    return vect;
}

但我一直收到这个错误:

/tmp/tmp.KYl9HEcObN/src/main.cpp:13: undefined reference to `SubwordEncoder::encode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'

我做错了什么?


备注:

我知道我可以做到:

add_executable(main src/main.cpp src/SubwordEncoder.cpp src/SubwordEncoder.h)

但我不想在这里添加每个文件。我希望 src/ 中的所有文件都用于编译。

最佳答案

当你调用 add_executable() 时,你只包含 main.cpp 而不是其他的,所以 SubwordEncoder::encode 是未定义的当您尝试在 main() 中使用它时。尝试将您的 CMake 文件更改为如下内容:

./CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(xlib)
set(CMAKE_CXX_STANDARD 11)        
add_subdirectory(src)  

./src/CMakeLists.txt

file(GLOB_RECURSE xlib_SOURCES "*.cpp")
file(GLOB_RECURSE xlib_HEADERS "*.h")

add_executable(main ${xlib_SOURCES} ${xlib_HEADERS}) 
# Include the current folder for including headers.
target_include_directories(main PRIVATE ${CMAKE_CURRENT_LIST_DIR})

关于c++ - 获取 "undefined reference to",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57329102/

相关文章:

c++ - 运行进程命令行

c++ - 如何使用 Node C++ 插件部署动态库?

android - 相同的 android cmake git 项目在一台 Ubuntu 机器上编译良好但在另一台 Ubuntu 机器上编译不成功,即使整个项目是相同的

c++ - CMake:构建并安装本地存储的子模块

c++ - QT,未定义对 `alpr::Alpr::~Alpr()' 的引用

c - 使用 minGW gcc 未定义对 _imp____glew* 函数的引用

c++ - "/usr/lib/libstdc .so.6: version ` GLIBCXX_3.4.1 5' not found"是什么意思,我该如何解决?

c++ - 将指针分配给带或不带限定符的指针

c - MSP430 (msp430-gcc) 链接器 undefined reference

c++ - 将一个类更改为它的子类