相关疑难解决方法(0)

如何从 macOS 应用程序包中排除标准但未使用的 libswift*.dylib 并减少包大小

当我使用 Xcode 9 构建用 Swift 4 编写的简单菜单栏 cocoa 应用程序时,许多 libswift*.dylib 库被链接/下载/嵌入到 .app 包中,进入 Frameworks 文件夹,如下所示:

库斯威夫特

我只在我的项目中使用import Cocoaand import Foundation,以及一些 @objc 函数作为计时器函数的选择器。我真的不认为我非常简单的菜单栏应用程序需要一些 3D 渲染 Metal 库函数或任何 SwiftOnoneSupport,所以我希望将它们从 .app 包中删除。(相同的库也包含在帮助程序应用程序中,用于在登录时启动功能,这甚至使帮助程序应用程序超过 10 MB)

我本以为 Xcode 实际上会默认复制所需的内容。这里这里提出了一些类似的问题,但我认为这两个问题都没有令人满意的最新答案。

到目前为止我已经尝试过的

我设置ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESNOin Build Settings. 好像没有什么效果。

我设置LINK_WITH_STANDARD_LIBRARIESNOin Build Settings. 它毁了一切,无法构建它,即使我尝试在“链接框架和库”部分下自己添加一些框架(Cocoa、Foundation)。

macos optimization xcode frameworks dylib

6
推荐指数
1
解决办法
956
查看次数

什么是 ABI,为什么 C++ 没有标准的,如果它有为什么重要?

什么是 ABI,为什么 C++ 没有标准的,如果它有为什么重要?

c++

5
推荐指数
1
解决办法
619
查看次数

Swift运行时库与Swift标准库

在本教程中,如何使用CocoaPods,我无法理解以下段落:

与Objective-C不同,iOS中不包含标准的Swift运行时库!这意味着您的框架必须包含必要的Swift运行时库.因此,用Swift编写的pod必须创建为动态框架.如果Apple允许使用Swift静态库,则会导致使用相同标准运行时依赖项的不同库中出现重复符号.

这是我的问题:

  1. 究竟什么是"标准Swift运行时库"?是斯威夫特标准库这样的一个标准快捷的运行时间库,将一个框架,我在写迅速被认为是迅速的运行时库?

  2. "Swift运行时库不包含在iOS中"究竟是什么意思?我想我无法推断出"iOS"所指的内容.

任何有关本段的其他见解,链接,资源或解释将不胜感激!

编辑:

在阅读运行时库wiki文章后,我不再对Q1感到困惑.以下段落为我澄清了这一点:

不应将运行时库的概念与应用程序员创建的或由第三方提供的普通程序库混淆,也不应与动态库混淆,这意味着在运行时链接的程序库.例如,C编程语言只需要一个最小的运行时库(通常称为crt0),但定义了一个必须由每个实现提供的大型标准库(称为C标准库).

但是我仍然对Q2感到困惑.

linker static-libraries dynamic-library cocoapods swift

3
推荐指数
1
解决办法
1027
查看次数

Swift 基础与标准库?

问题 - Swift Foundation 和标准库有什么区别?

我知道他们不在同一个存储库中。Swift 标准库Swift 基金会

我的理解是Swift 标准库是低级库,支持核心数据类型、数组等......用Swift编写。而斯威夫特基金会是指,被已列入写在迅速语言的常用工具代码更高的水平。但我的困惑是,为什么像 NSArray 这样的 Objective-c 类包含在Foundation库中?你能详细解释一下吗?

foundation swift

3
推荐指数
1
解决办法
460
查看次数

iOS什么时候使用动态链接库?在iOS中使用动态库有什么好处?

我对Window 或 Linux 中的动态链接库和 iOS 中的动态链接库的优势之间的差异感到很奇怪。

\n

下面的\xe2\xac\x87\xef\xb8\x8f这几句就是为了证明我为什么感觉怪怪的。

\n

我了解到库可以分为静态库动态库

\n

使用动态库的优点是允许其他应用程序使用相同的动态库(在Window中,.dll文件),这样每个应用程序的内存使用量都可以减少,并且可以更容易地重新分发动态库而不是重新分发应用程序。\n实际上我在使用某些应用程序时可能会遇到“没有XXX.dll文件”的情况

\n

在Xcode中,当创建新项目时,我们可以在.\n中选择框架静态库framework & library。\n创建项目后,我们可以选择如何成为Mach-O Type,例如“可执行文件,动态库,静态库”等。

\n

所以,我认为如果我选择带有动态库的Mach-O类型,则该项目将使用动态链接库以链接方式编译。

\n

\xe2\xac\x87\xef\xb8\x8f 我真的很想知道。

\n
    \n
  1. 但就像在 Window 中一样,iOS 用户可以在 iPhone 中下载.so 文件以便应用程序正常工作或更新动态库吗?
  2. \n
  3. iPhone 中启动的其他应用程序可以使用相同的动态库吗?
  4. \n
\n

因为我无法体验到这一点。

\n
    \n
  1. 如果它(1,2)不能,为什么要使用动态库,即使我们无法像在 Window 或 Linux 中那样获得使用动态库的实际优势?
  2. \n
\n

xcode dynamic-linking dynamic-library ios

2
推荐指数
1
解决办法
2225
查看次数

被调用方如何知道参数是通过寄存器而不是堆栈传递的

假设我们得到一个简单的程序

#include <cstdio>

int main(int argc, char* argv[]) {
    int n = argc;
    if (n > 1) {
        n = 1;
    }else {
        n = -1;
    }
    printf("%d\n", n);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

g++ main.cpp -S -O1在ubuntu x64下使用Windows子系统生成的汇编代码和汇编代码段

subq    $8, %rsp
cmpl    $1, %edi
setg    %dl
movzbl  %dl, %edx
leal    -1(%rdx,%rdx), %edx
movl    $.LC0, %esi
movl    $1, %edi
movl    $0, %eax
call    __printf_chk
movl    $0, %eax
addq    $8, %rsp
ret
Run Code Online (Sandbox Code Playgroud)

push没有访问内存的指令,也没有访问内存的指令。因此,n必须通过传递参数%edx。现在,我想知道c库函数如何__printf_chk知道其中%edx …

c++ assembly g++ x86-64 calling-convention

1
推荐指数
1
解决办法
81
查看次数

关于为什么windows'.dll不适用于linux的细节

我很好奇能够在Linux编译的C++代码中使用Windows中编译的最原始的DLL库.让我们假设库的问题不是滔天专有的东西从Windows核心;

...只有一个与假的API一样(这里是标题和实现):

// MathFuncsDll.h

namespace MathFuncs
{
    class MyMathFuncs
    {
    public:
        // Returns a + b
        static __declspec(dllexport) double Add(double a, double b);

        // Returns a - b
        static __declspec(dllexport) double Subtract(double a, double b);
    };
}


// MathFuncsDll.cpp

#include "MathFuncsDll.h"

using namespace std;

namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b)
    {
        return a + b;
    }

    double MyMathFuncs::Subtract(double a, double b)
    {
        return a - b;
    }
}
Run Code Online (Sandbox Code Playgroud)

除了<iostream>之外,这个库没有依赖项,不是吗?

Linux编译的.cpp将包含以下内容:

// MyExecRefsDll.cpp
// compile with: /EHsc …
Run Code Online (Sandbox Code Playgroud)

c++ linux windows dll shared-libraries

0
推荐指数
1
解决办法
321
查看次数

为什么g ++与-O3段错误与以下LLVM库代码

所以我想使用llvm::Twine字符串块类.

我有以下样本:

#include <llvm/ADT/Twine.h>
#include <iostream>

int main()
{
  llvm::Twine twine1 = llvm::Twine("aaaa") + "bbbb" + "cccc" + "dddd";
  llvm::Twine twine2 = llvm::Twine(twine1) + "dddd" + "eeee";
  std::cout << twine1.str() << std::endl;
  std::cout << twine2.str() << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它运行与clang++使用-O3,并g++-O0但段错误g++使用-O3.我尝试了这个代码从3.4-3.9部分不同版本的clang库并试过g++ 4.8.4,g++ 4.8.5mingw-5.3.0.

您需要llvm库并将代码与-lLLVMSupport -lLLVMCore其他代码链接起来llvm-config --ldflags

c++ llvm clang c++11

0
推荐指数
1
解决办法
104
查看次数