我尝试了几种方法来解决此问题,但是显然我无法理解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/
中的所有文件用于编译。
答案 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)