Qt 和 CMake 失败并出现重复的符号
Qt and CMake fails with duplicate symbols
我的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)
主.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();
}
最后服务器.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)
告诉我有一个重复的符号。如何解决这个问题?
最好不要对.cpp
文件使用#include
。最好将定义和声明拆分为不同的文件。
(一个例外是 PIMPL 模式情况下的私人声明。
如果您想避免拆分,因为您只有一小段代码,请使用头文件并在类的定义中实现您的方法。
如果实现了库:不要安装头文件,以防您的类不能从外部访问。
如评论中所述,针对您的情况的简单修复方法是从您的 cpp 中#include "server.cpp"
(很少需要这样做,几乎从来都不是一件好事)。
第二件事是将#include "server.moc"
行移动到 cpp 文件的末尾。这很重要,因为此文件包含注入Q_OBJECT
的一些成员函数的实现,并且需要在其主体外部实现成员函数之前定义该类。
相关文章:
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- CMake 生成的 MSVC 项目找不到符号,即使为其相关 dll 正确生成了 lib 文件也是如此
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- 在OSx:ld上使用CMake构建C++项目:找不到体系结构x86_64的符号
- 简单的cmake项目,在Windows上使用nmake构建没有调试符号
- CMAKE - 如何定义目标库的符号,具体取决于谁使用它
- 如何链接项目符号库(来自FindBullet.cmake)?
- 如何打印 ;符号使用 CMake 命令
- glfw3库在带有cmake的clion中导致macOS上的不确定符号
- OS X, CMake, Boost: 未定义的架构符号 x86_64: "boost::system::detail::generic_category_instance"
- Qt 和 CMake 失败并出现重复的符号
- Android Cmake编译器正在生成带有额外前缀和符号后缀的.out文件
- OpenCV 模块作为符号链接会导致 cmake 错误
- ICU ustdio.h函数:使用CMake构建时,在Mac操作系统上使用未定义的符号
- 将项目符号包含目录与 cmake 链接
- 体系结构x86_64的未定义符号,共享Util库,使用cmake构建,
- Ctypes 在使用 CMake 创建的共享库中找不到符号
- 如何在没有调试符号和优化的情况下创建 cmake 构建配置
- 无法从使用 Cmake 创建的可执行文件中删除符号名称
- Cmake 错误未定义的符号x86_64