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

我想完成一个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库的引用将被删除;该项目将在没有libstdc++依赖关系的Windows 10上生成并执行。如果取消对这两行的注释,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

#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})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值