如何解决使用 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 举报,一经查实,本站将立刻删除。