如何解决 multi-file cpp 项目中的链接器错误
How to solve linker error in multi-file cpp project
我有 3 个文件。一个 header (.h),一个 cpp (.cpp) 和一个 main (main.cpp).
在 main 中,我只想包含 .h 文件而不是 .cpp 以使用定义的那些功能。
这是文件
person.h
#ifndef PERSON_H
#define PERSON_H
#include <string>
class Person {
public:
Person(std::string &&n) : _name(&n), _address(nullptr) {}
~Person() {
delete _name;
delete _address;
}
void set_name(std::string *name);
void set_address(std::string *address);
std::string get_name();
std::string get_address();
private:
std::string *_name;
std::string *_address;
};
#endif
person.cpp
#include "person.h"
void Person::set_name(std::string *name) {
_name = name;
}
void Person::set_address(std::string *address) {
_address = address;
}
std::string Person::get_name() {
return *_name;
}
std::string Person::get_address() {
return *_address;
}
main.cpp
#include <iostream>
#include "person.h"
int main() {
Person *John = new Person("John Doe");
std::cout << john->get_name() << std::endl;
return 0;
}
所有这些文件都位于同一目录中。我也定义了 CMakeLists.txt。
CMakeLists.txt
cmake_minimum_required(VERSION "3.7.1")
set(CMAKE_CXX_STANDARD 17)
project("undirected_graph")
add_executable(${PROJECT_NAME} src/main.cpp )
这是我在编译时收到的错误
Undefined symbols for architecture x86_64:
"Person::get_name()", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
link 人的工作是 link person.h 和 person.cpp 并在要求将 person.h 包含在 [=38= 中时将它们组合在一起成为 main.cpp ]main.cpp?
顺便说一句,如果我在 [ 中包含 person.cpp 而不是 person.h,一切正常=62=].
如 Igor Tandetrik 所述,您未在实际构建中包含 person.cpp
add_executable(${PROJECT_NAME} src/main.cpp src/person.cpp)
应该可以带你到那里。
我有 3 个文件。一个 header (.h),一个 cpp (.cpp) 和一个 main (main.cpp).
在 main 中,我只想包含 .h 文件而不是 .cpp 以使用定义的那些功能。
这是文件
person.h
#ifndef PERSON_H
#define PERSON_H
#include <string>
class Person {
public:
Person(std::string &&n) : _name(&n), _address(nullptr) {}
~Person() {
delete _name;
delete _address;
}
void set_name(std::string *name);
void set_address(std::string *address);
std::string get_name();
std::string get_address();
private:
std::string *_name;
std::string *_address;
};
#endif
person.cpp
#include "person.h"
void Person::set_name(std::string *name) {
_name = name;
}
void Person::set_address(std::string *address) {
_address = address;
}
std::string Person::get_name() {
return *_name;
}
std::string Person::get_address() {
return *_address;
}
main.cpp
#include <iostream>
#include "person.h"
int main() {
Person *John = new Person("John Doe");
std::cout << john->get_name() << std::endl;
return 0;
}
所有这些文件都位于同一目录中。我也定义了 CMakeLists.txt。
CMakeLists.txt
cmake_minimum_required(VERSION "3.7.1")
set(CMAKE_CXX_STANDARD 17)
project("undirected_graph")
add_executable(${PROJECT_NAME} src/main.cpp )
这是我在编译时收到的错误
Undefined symbols for architecture x86_64:
"Person::get_name()", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
link 人的工作是 link person.h 和 person.cpp 并在要求将 person.h 包含在 [=38= 中时将它们组合在一起成为 main.cpp ]main.cpp?
顺便说一句,如果我在 [ 中包含 person.cpp 而不是 person.h,一切正常=62=].
如 Igor Tandetrik 所述,您未在实际构建中包含 person.cpp
add_executable(${PROJECT_NAME} src/main.cpp src/person.cpp)
应该可以带你到那里。