微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 MinGW 链接到 exe 时的多个定义

如何解决使用 MinGW 链接到 exe 时的多个定义

当使用 MinGW 将 exe 直接链接到 dll 时,一切正常。但是如果不是这样(将 dll 直接链接到可执行文件),我会收到多个定义错误

Failed: liblib.dll liblib.dll.a 
cmd.exe /C "cd . && C:\msys64\mingw64\bin\c++.exe -g   -shared -o liblib.dll -Wl,--out-implib,liblib.dll.a -Wl,--major-image-version,--minor-image-version,0 CMakeFiles/lib.dir/lib.cpp.obj  app.exe  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe: in function `atexit':
C:/_/M/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:420: multiple deFinition of `atexit'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:C:/_/M/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtdll.c:205: first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:cygming-crtbegin.c:(.text+0x520): multiple deFinition of `__gcc_register_frame'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/crtbegin.o:cygming-crtbegin.c:(.text+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:cygming-crtbegin.c:(.text+0x530): multiple deFinition of `__gcc_deregister_frame'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/crtbegin.o:cygming-crtbegin.c:(.text+0x10): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:main.cpp:(.rdata+0x400): multiple deFinition of `.refptr.__native_startup_state'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:crtdll.c:(.rdata$.refptr.__native_startup_state[.refptr.__native_startup_state]+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:C:/_/M/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:424: multiple deFinition of `__mingw_module_is_dll'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:C:/_/M/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crtdll.c:209: first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:main.cpp:(.rdata+0x430): multiple deFinition of `.refptr.__xi_a'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:crtdll.c:(.rdata$.refptr.__xi_a[.refptr.__xi_a]+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:main.cpp:(.rdata+0x3f0): multiple deFinition of `.refptr.__native_startup_lock'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:crtdll.c:(.rdata$.refptr.__native_startup_lock[.refptr.__native_startup_lock]+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:main.cpp:(.rdata+0x380): multiple deFinition of `.refptr.__dyn_tls_init_callback'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:crtdll.c:(.rdata$.refptr.__dyn_tls_init_callback[.refptr.__dyn_tls_init_callback]+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:main.cpp:(.rdata+0x4b0): multiple deFinition of `.refptr.mingw_app_type'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:crtdll.c:(.rdata$.refptr.mingw_app_type[.refptr.mingw_app_type]+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:crtexe.c:(.idata+0x310): multiple deFinition of `__imp__ZSt4cout'; app.exe:crtexe.c:(.idata+0x310): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:main.cpp:(.rdata+0x410): multiple deFinition of `.refptr.__xc_a'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:crtdll.c:(.rdata$.refptr.__xc_a[.refptr.__xc_a]+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:main.cpp:(.rdata+0x440): multiple deFinition of `.refptr.__xi_z'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:crtdll.c:(.rdata$.refptr.__xi_z[.refptr.__xi_z]+0x0): first defined here
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: app.exe:main.cpp:(.rdata+0x420): multiple deFinition of `.refptr.__xc_z'; C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/lib/../lib/dllcrt2.o:crtdll.c:(.rdata$.refptr.__xc_z[.refptr.__xc_z]+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand Failed.
// app.h

#pragma once

void printHello();

template <typename T>
T sum(const T& a,const T&b)
{
    return a + b;
}

extern template int sum(const int& a,const int& b);
// main.cpp

#include "app.h"

#include <iostream>

void printHello()
{
    std::cout << "hello" << std::endl;
}

template int sum(const int& a,const int& b);

int main()
{
    return 0;
}
// lib.cpp

#include "app.h"

static void internal_function()
{
    printHello();
    int a = sum(4,8);
}
# CMakeLists.txt

add_library(lib SHARED lib.cpp)
add_executable(app main.cpp)
target_link_libraries(lib PRIVATE $<TARGET_FILE:app>)

我该如何解决


这个问题的原因是带有内联成员函数的MinGW的奇怪行为:当上面的代码被编译时,它没有将任何符号导出到静态库(假设添加__declspec(dllexport))。我已经问过这方面的 question

在这种情况下,cmake 将是:

# CMakeLists.txt

add_library(lib SHARED lib.cpp)
add_executable(app main.cpp)
set_target_properties(app PROPERTIES ENABLE_EXPORTS 1)
target_link_libraries(lib PRIVATE app)

但这不是这个问题的内容


直接链接可执行文件的另一个原因来自 MinGW 链接器中的错误。当使用导出的符号(导入 C 函数链接到 MSVC 编译的静态库时,链接器可能会创建一个空的导入表。在实现 Node JS 插件时,您必须链接到可执行文件 (node js core.exe),this 问题描述了该主题解决方案是直接链接可执行文件

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。