【问题标题】:How to solve linker error in multi-file cpp project [duplicate]如何解决多文件cpp项目中的链接器错误[重复]
【发布时间】:2021-04-15 01:55:00
【问题描述】:

我有 3 个文件。一个标头 (.h)、一个 cpp (.cpp) 和一个主 (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;
}

ma​​in.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)

链接器的工作不是链接 person.hperson.cpp 并将它们组合到 ma​​in.cpp 时要求在 ma​​in.cpp 中包含 person.h

顺便说一句,如果我在 ma​​in.cpp 中包含 person.cpp 而不是 person.h,则一切正常。

【问题讨论】:

  • 你没有编译或链接person.cpp。在你的 make 文件中没有提到它 - 你如何期望编译器或链接器知道它甚至存在?
  • 作为问答场景,我很欣赏你的第一句话,因为它很有帮助。众所周知,第二个令人沮丧。我尊重每个人,并期待它回来。

标签: c++ c++11 cmake c++17 linker-errors


【解决方案1】:

正如 Igor Tandetrik 所说,您在实际构建中没有包括 person.cpp

add_executable(${PROJECT_NAME} src/main.cpp src/person.cpp)

应该能带你到那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多