当我使用 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_LIBRARIES为NOin Build Settings. 好像没有什么效果。
我设置LINK_WITH_STANDARD_LIBRARIES为NOin Build Settings. 它毁了一切,无法构建它,即使我尝试在“链接框架和库”部分下自己添加一些框架(Cocoa、Foundation)。
在本教程中,如何使用CocoaPods,我无法理解以下段落:
与Objective-C不同,iOS中不包含标准的Swift运行时库!这意味着您的框架必须包含必要的Swift运行时库.因此,用Swift编写的pod必须创建为动态框架.如果Apple允许使用Swift静态库,则会导致使用相同标准运行时依赖项的不同库中出现重复符号.
这是我的问题:
究竟什么是"标准Swift运行时库"?是斯威夫特标准库这样的一个标准快捷的运行时间库,将一个框架,我在写迅速被认为是迅速的运行时库?
"Swift运行时库不包含在iOS中"究竟是什么意思?我想我无法推断出"iOS"所指的内容.
任何有关本段的其他见解,链接,资源或解释将不胜感激!
编辑:
在阅读运行时库wiki文章后,我不再对Q1感到困惑.以下段落为我澄清了这一点:
不应将运行时库的概念与应用程序员创建的或由第三方提供的普通程序库混淆,也不应与动态库混淆,这意味着在运行时链接的程序库.例如,C编程语言只需要一个最小的运行时库(通常称为crt0),但定义了一个必须由每个实现提供的大型标准库(称为C标准库).
但是我仍然对Q2感到困惑.
我对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,例如“可执行文件,动态库,静态库”等。
所以,我认为如果我选择带有动态库的Mach-O类型,则该项目将使用动态链接库以链接方式编译。
\n\xe2\xac\x87\xef\xb8\x8f 我真的很想知道。
\n因为我无法体验到这一点。
\n假设我们得到一个简单的程序
#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 …
我很好奇能够在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) 所以我想使用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.5和mingw-5.3.0.
您需要llvm库并将代码与-lLLVMSupport -lLLVMCore其他代码链接起来llvm-config --ldflags