c++ - 如何修复目标文件中的重复函数?
问题描述
我正在构建一个程序只是为了提高我的 OOP 技能。这是我的项目结构:
Project
-.vscode
-build
-includes
- ContactInfo.h
- Customer.h
- Owner.h
- PersonalInfo.h
- User.h
-src
- ContactInfo.cpp
- Customer.cpp
- Owner.cpp
- PersonalInfo.cpp
- User.cpp
- wrapper.h
- wrapper.cpp
- main.cpp
- CMakeLists.txt
问题是当我make
在构建文件路径的 cmd 中键入命令时,我收到以下错误:
duplicate symbol '_key' in:
CMakeFiles/make_test_project.dir/src/main.cpp.o
CMakeFiles/make_test_project.dir/src/wrapper.cpp.o
duplicate symbol '_customers' in:
CMakeFiles/make_test_project.dir/src/main.cpp.o
CMakeFiles/make_test_project.dir/src/wrapper.cpp.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [make_test_project] Error 1
make[1]: *** [CMakeFiles/make_test_project.dir/all] Error 2
make: *** [all] Error 2
我可以猜到这里发生了什么,我基本上在文件和wrapper.h
文件中都包含了文件,但我不知道如何修复它。我也想以这种方式保持我的项目结构。那么有什么办法可以解决这个错误吗?main.cpp
wrapper.cpp
这是我的wrapper.h
文件:
#ifndef WRAPPER_H
#define WRAPPER_H
#include "../includes/Customer.h"
#include <vector>
#include <iostream>
char key;
void printUI();
void RunApplication();
PersonalInfo CreatePersonalInfo(std::string &, std::string &, int & );
ContactInfo CreateContactInfo(std::string &, std::string &, std::string &, int&);
void DisplayAllCustomers();
void AddCustomerToList(Customer &);
Customer CreateCustomer(PersonalInfo &, ContactInfo &);
std::vector<Customer> customers;
#endif
这是我的main.cpp
文件:
#include "wrapper.h"
int main()
{
RunApplication();
}
下面是我的CMakeLists.txt
文件:
cmake_minimum_required(VERSION 3.13)
project(cmake_test_project)
set(CMAKE_CXX_STANDARD 17)
add_executable(make_test_project src/main.cpp src/wrapper.cpp src/ContactInfo.cpp src/PersonalInfo.cpp src/Customer.cpp src/User.cpp)
注意:我不会分享wrapper.cpp
文件,因为它是一个由近 120 行组成的文件,但我可以给你我也在wrapper.h
文件中包含文件的信息wrapper.cpp
。
请随时询问更多信息,谢谢。
解决方案
在你的 wrapper.h
extern char key;
void printUI();
void RunApplication();
PersonalInfo CreatePersonalInfo(std::string &, std::string &, int & );
ContactInfo CreateContactInfo(std::string &, std::string &, std::string &, int&);
void DisplayAllCustomers();
void AddCustomerToList(Customer &);
Customer CreateCustomer(PersonalInfo &, ContactInfo &);
extern std::vector<Customer> customers;
并在一个且只有一个 .cpp 文件中声明。
如果你有 C++17,你可以交换 externinline
并完成。
推荐阅读
- asp.net - TLS 相互身份验证 Azure
- powershell - 如何查询 Powershell cmdlet 参数值
- javascript - Javascript表单验证 - 无法设置null属性
- c# - Nuget 包验证在构建机器上花费的时间太长
- python - Django rest-framework 通过与外键连接的其他模型的名称过滤模型
- d3.js - d3jsv4 时间线图,在擦洗期间带有垂直月轴
- java - 在 TestNG 上更改 JUnit,NullPointerException
- python - 安装 Python Python 3.7 + Tensorflow 2.0 + Jupyter Notebook 2020 并面临问题
- android - 如果 BLE 服务器在 Android 6 上运行,则 BLE 状态 GATT_CONN_TERMINATE_PEER_USER
- shell - AppleScript 到 Shell 脚本