获得"undefined reference to"

Getting "undefined reference to"

本文关键字:to reference undefined 获得      更新时间:2023-10-16

我尝试了几件事来解决此问题,但是我只是无法抓住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而不是其他人,因此当您尝试在main()中使用它时,SubwordEncoder::encode是不确定的。尝试将您的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})

实际上导致文件被编译的任何一个CMAKE文件中的唯一行是add_executable(main src/main.cpp),并且唯一添加的文件是main.cpp。任何一个CMAKE文件中都没有任何东西可以告诉其编译其他源文件。

这些线

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

仅设置包含文件名列表的变量。然后没有任何包含这些文件中的任何汇编。您的选项是将这些文件添加到您的main目标的汇编中,如SquaresKittles回答,或者将其编译为单独的库,然后将其链接到MAIN:

src/cmakelists.txt:

add_library(SubwordEncoder ${xlib_SOURCES})

./cmakelists.txt:

target_link_libraries(main SubwordEncoder)
相关文章: