Mingw64: добавить статически связанную библиотеку, добавить зависимость libstdc ++ - PullRequest
1 голос
/ 15 июня 2019

Я хочу создать исполняемый файл 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 будет связана;проект строится, но не будет выполняться в Windows 10 из-за зависимости libstdc ++.(Примечание: в 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})

При включенном MingW64В Linux и MingW64 / MSYS2 в Windows 10 я получаю зависимость libstdc ++, когда связываюсь с библиотекой hello_lib.В обоих случаях, если я закомментирую ссылку на hello_lib, зависимость libstdc ++ устраняется.

...