gpt4 book ai didi

c++ - Qt 和 CMake 因重复符号而失败

转载 作者:行者123 更新时间:2023-12-01 14:59:09 24 4
gpt4 key购买 nike

我的 c++/qt 项目中有 3 个文件,我正在使用 CMake。我正在尝试编译它这里有一些代码:

CMakeLists 包含:

cmake_minimum_required(VERSION 3.8)
project(untitled)

set(CMAKE_CXX_STANDARD 14)

set(CMAKE_PREFIX_PATH /Users/username/Qt/5.9.2/clang_64/)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

find_package(Qt5Core)
find_package(Qt5Network)

set(SOURCE_FILES main.cpp server.cpp)

add_executable(untitled ${SOURCE_FILES})

target_link_libraries(${PROJECT_NAME} Qt5::Core)
target_link_libraries(${PROJECT_NAME} Qt5::Network)

Main.cpp 包含:
#include <iostream>
#include <QCoreApplication>
#include <QtDebug>
#include "server.cpp"

int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
MyTcpServer server;
return app.exec();
}

最后 server.cpp 包含:
#include <QObject>
#include <QTcpSocket>
#include <QTcpServer>
#include "server.moc"

class MyTcpServer : public QObject
{
Q_OBJECT
public:
explicit MyTcpServer(QObject *parent = 0);

public slots:
void slotNewConnection();
void slotServerRead();
void slotClientDisconnected();

private:
QTcpServer * mTcpServer;
QTcpSocket * mTcpSocket;
};

MyTcpServer::MyTcpServer(QObject *parent) : QObject(parent)
{
...
}

void MyTcpServer::slotNewConnection()
{
...
}

void MyTcpServer::slotServerRead()
{
...
}

void MyTcpServer::slotClientDisconnected()
{
mTcpSocket->close();
}

我正在尝试使用 CMake 编译我的项目,当我运行 CMake 时,我遇到了这个问题:
duplicate symbol __ZN11MyTcpServer18qt_static_metacallEP7QObjectN11QMetaObject4CallEiPPv in:
CMakeFiles/untitled.dir/main.cpp.o
CMakeFiles/untitled.dir/server.cpp.o
...
duplicate symbol __ZN11MyTcpServer16staticMetaObjectE in:
CMakeFiles/untitled.dir/main.cpp.o
CMakeFiles/untitled.dir/server.cpp.o
ld: 13 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

告诉我有一个重复的符号。
如何解决这个问题?

最佳答案

最好不要使用#include对于 .cpp文件。将定义和声明拆分为不同的文件是一种很好的做法。

(其中一个异常(exception)是 PIMPL 模式的私有(private)声明。)

如果您想避免拆分,因为您只有一小段代码,请使用头文件并在类的定义中实现您的方法。

如果实现了库:不要安装头文件,以防您的类不能从外部访问。

关于c++ - Qt 和 CMake 因重复符号而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46998826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com