首页 > 解决方案 > 获取“未定义的引用”

问题描述

我尝试了几件事来解决这个问题,但显然我无法理解 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/用于编译。

标签: c++cmakeundefined-reference

解决方案


当您调用时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})

推荐阅读