Mingw32 无法静态 link 到 libgcc_s_dw2-1、libstdc++-6、libwinpthread-1 (Qt 5.7.1)
Mingw32 failing to statically link to libgcc_s_dw2-1, libstdc++-6, libwinpthread-1 (Qt 5.7.1)
我在用 mingw32 编译时遇到静态链接 libgcc_s_dw2-1、libstdc++-6、libwinpthread-1 库的问题。
如果我构建一个独立的应用程序,使用 -static-libgcc -static-libstdc++ -static -lwinpthread
标志设置项目会有所帮助。但是当我将 Qt 5.7.1 用于 mingw32 编译器时,它没有帮助。应用程序不会开始抱怨缺少这些库!
这是我的 CMakeLists.txt
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(dummyapp LANGUAGES CXX)
find_package(Qt5 REQUIRED COMPONENTS Core)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++ -static -lwinpthread")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
add_executable(app
app.cpp)
target_link_libraries(app
PRIVATE
Qt5::Core
)
add_custom_command(TARGET app PRE_LINK
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:app>
)
app.cpp
#include <iostream>
#include <QVariant>
int main(int argc, const char **argv)
{
std::cout << "Hello dummy!" << std::endl;
QVariant var{};
std::cin.get();
return 0;
}
我怀疑,造成这种行为的原因是 Qt 本身是动态链接到这些库的。
解决方法是什么?有补救办法吗?如果没有,我如何在构建时自动部署这些库?
如果您的构建及其依赖项不是静态的,则这些 DLL 需要与您的应用程序一起分发。
https://lwn.net/Articles/549573/ 上的文章解释了 libstdc++-6 DLL 可以在没有许可问题的情况下分发。
我在用 mingw32 编译时遇到静态链接 libgcc_s_dw2-1、libstdc++-6、libwinpthread-1 库的问题。
如果我构建一个独立的应用程序,使用 -static-libgcc -static-libstdc++ -static -lwinpthread
标志设置项目会有所帮助。但是当我将 Qt 5.7.1 用于 mingw32 编译器时,它没有帮助。应用程序不会开始抱怨缺少这些库!
这是我的 CMakeLists.txt
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(dummyapp LANGUAGES CXX)
find_package(Qt5 REQUIRED COMPONENTS Core)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++ -static -lwinpthread")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
add_executable(app
app.cpp)
target_link_libraries(app
PRIVATE
Qt5::Core
)
add_custom_command(TARGET app PRE_LINK
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:app>
)
app.cpp
#include <iostream>
#include <QVariant>
int main(int argc, const char **argv)
{
std::cout << "Hello dummy!" << std::endl;
QVariant var{};
std::cin.get();
return 0;
}
我怀疑,造成这种行为的原因是 Qt 本身是动态链接到这些库的。
解决方法是什么?有补救办法吗?如果没有,我如何在构建时自动部署这些库?
如果您的构建及其依赖项不是静态的,则这些 DLL 需要与您的应用程序一起分发。 https://lwn.net/Articles/549573/ 上的文章解释了 libstdc++-6 DLL 可以在没有许可问题的情况下分发。