获取“未定义的引用”

时间:2019-08-02 15:04:25

标签: 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/中的所有文件用于编译。

2 个答案:

答案 0 :(得分:1)

当您呼叫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})

答案 1 :(得分:0)

两个CMake文件中唯一实际导致文件编译的行是add_executable(main src/main.cpp),而它添加的唯一文件是main.cpp。两个CMake文件中都没有任何内容告诉它编译其他源文件。

这些行

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

仅设置包含文件名列表的变量。没有任何东西可以将这些文件包含在任何编译中。您的选择是将这些文件添加到main目标的编译中,如在skittlettles答案中一样,或者将它们编译为单独的库,然后将其链接到main中:

src / CMakeLists.txt:

add_library(SubwordEncoder ${xlib_SOURCES})

./ CMakeLists.txt:

target_link_libraries(main SubwordEncoder)