Mingw64:添加静态链接库添加libstdc++依赖

问题描述 投票:0回答:1

我想完成一个 C++ 可执行文件,它链接到我自己的另一个 C++ 库,而不需要 libstdc++ 依赖项。我可以毫无困难地在没有库的情况下创建这样的 C++ 可执行文件。但是,一旦我将其链接到我的库,可执行文件现在就具有 libstdc++ 依赖项。要求是不需要将 libstdc++6.dll(或任何其他 .dll)复制到 Windows 上。

我正在 Linux (Centos 7) 上使用最新的 mingw64 (x86_64-w64-mingw32-gcc (GCC) 4.9.3) 进行构建,交叉编译到 Windows。在 MSYS2/MingW 上构建也会产生相同的不良结果。

(顺便说一句,我安装了 libstdc++-static 和 glibc-static)

在示例中,两行被标记为“COMMENT ME OUT”:一行位于 hello_c/main.cpp 中,另一行位于 hello_c/CMakeLists.txt 中。如果您注释掉这些内容,则对 hello_lib 库的引用将被删除;该项目在 Windows 10 上构建并执行可执行文件,无需 libstdc++ 依赖项。如果取消这两行的注释,则会链接 hello_lib 库中的函数;该项目可以构建,但由于 libstdc++ 依赖性而无法在 Windows 10 上执行。 (注意:在 powershell 中它会默默地失败,在老式的 dos/cmd 框中它会显示一条错误消息。)

该示例具有以下结构:

hello_lib/library.cpp
hello_lib/library.h
hello_lib/CMakeLists.txt
hello_c/main.cpp
hello_c/CMakeLists.xt
buildme.sh 
toolchain.cmake

## hello_lib/library.h:
int hello();

// hello_lib/library.cpp:
#include "library.h"
int hello() {
    return 666;
}

## hello_lib CMakeLists.txt:
cmake_minimum_required(VERSION 3.13)
project(hello_lib)
set(CMAKE_CXX_STANDARD 11)
if(MINGW) 
    # Including these flags on Linux on Linux build = "Missing ELF     Interpreter" error
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static -static-libgcc -static-libstdc++")
endif()
add_library(hello_lib STATIC library.cpp)

## hello_c/main.cpp:
#include <iostream>
#include "../hello_lib/library.h"
int main() {
    std::cout << "Hello, world" << std::endl;
    //COMMENT ME OUT:
    printf("x = %d\n", hello());
    return 0;
}

## hello_c CMakeLists.txt:
cmake_minimum_required(VERSION 3.13)
project(hello_c)
set(CMAKE_CXX_STANDARD 11)
if(MINGW)
    # Including these flags on Linux on Linux build = "Missing ELF     Interpreter" error
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static -static-libgcc -static-libstdc++")
endif()
link_directories(../hello_lib/cmake-build-debug)
add_executable(hello_c main.cpp)
# COMMENT ME OUT:
target_link_libraries(hello_c -static-libgcc -static-libstdc++ libhello_lib.a)

## buildme.sh:
#!/bin/bash
set -e
for i in hello_lib hello_c
do
    rm -rf $i/cmake-build-debug
    mkdir $i/cmake-build-debug
    pushd $i/cmake-build-debug
    # For building Win64 on Linux (with MinW64):
    cmake .. -DCMAKE_TOOLCHAIN_FILE="../toolchain.cmake" -DCMAKE_BUILD_TYPE=Debug
    # For building Win64 on Win64/MSYS2/MinW64:
    #cmake .. -G "MSYS Makefiles" -DCMAKE_BUILD_TYPE=Debug
    # For building Linux on Linux
    #cmake .. -DCMAKE_BUILD_TYPE=Debug
    make
    popd
done

## toolchain.cmake:
set(CMAKE_SYSTEM_NAME Windows)
set(TOOLCHAIN_PREFIX x86_64-w64-mingw32)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)
set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX})

对于 Linux 上的 MingW64 和 Windows 10 上的 MingW64/MSYS2,当我链接到“hello_lib”库时,我获得了 libstdc++ 依赖项。在这两种情况下,如果我注释掉对 hello_lib 的引用,就会消除 libstdc++ 依赖关系。

static-libraries mingw-w64 libstdc++
1个回答
0
投票

我注意到您将标志

-static -static-libgcc -static-libstdc++
添加到
CMAKE_CXX_FLAGS
,用于编译标志。您需要将这些标志添加到链接器中,以告诉它与静态库link

© www.soinside.com 2019 - 2024. All rights reserved.