标签: dylib

如何从 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
查看次数

XCode中的动态库

我试图在XCode中创建一个mac应用程序,它在动态库中有一些实现.

我在我的XCode可可项目中添加了一个新的目标(动态库),在与框架和预编译头文件进行了一些斗争之后,进行了dynlib编译 - 并从调试器中成功运行.

当独立运行时,显然dynlib处于错误的位置."未加载库:/usr/local/lib/testlib.dynlib".在Windows上 - 我更常用的平台 - Dll可以放在与exe相同的文件夹中,也可以放在系统路径的任何位置.

我宁愿我的应用程序在其应用程序包中的某处找到它的dynlib(并且某些文档似乎证实这是正确的方法),但我不知道如何.

是否可以在XCode中配置项目,以便dylib实际上被复制到应用程序包中,在应用程序将查找它的位置?


看来我不需要使用otool来重置搜索路径.如果我编辑目标信息 - >构建 - >部署 - >安装目录,我可以从XCode内部更改dyld将为dylib查看的路径.默认情况下,新的动态库项目的路径设置为/usr/local/lib.我已经改为./- otool确认./现在是dyld将要寻找这个特定动态模块的地方.不幸的是./似乎并没有实际引用我的应用程序包中的任何目录:(

所以,我的问题(在其他线程中没有回答)现在是:1.如何在目标信息 - > ... - >安装目录设置中输入有意义的相对路径,以及2.如何自动获取XCode将dylib'target'复制到相对位置的应用程序包目标的bundle文件夹中?

xcode cocoa dylib

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

Mac OS X libcurl dylib兼容版本

我的应用程序在10.6上构建并运行良好.我将Base SDK设置为10.6,将Mac OS X部署目标设置为10.5.

我的应用程序使用系统libcurl.dylib - 而不是将dylib添加-lcurl到项目中,我只是添加到构建设置中的链接器标志.(虽然我已经尝试过两种方式.)

当我在10.5.8上启动应用程序时,出现以下错误

Dyld错误消息:未加载库:/usr/lib/libcurl.4.dylib

参考自:/ Applications/My Application.app/Contents/MacOS/MyApplication

原因:库版本不兼容:

MyApplication需要6.0.0或更高版本,但libcurl.4.dylib提供5.0.0版

果然,如果我otool -L是应用程序的二进制文件,我会得到以下libcurl:

/usr/lib/libcurl.4.dylib(兼容版本6.0.0,当前版本6.1.0)

有没有办法绕过这个,或者我应该静态链接我自己的libcurl构建?

macos dylib libcurl

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

dylib析构函数不会被调用

我有一个dylib,我可以通过注入mac os x加载.构造函数调用运行良好.

 __attribute__((constructor))
 static void initialize()
Run Code Online (Sandbox Code Playgroud)

但析构函数不会被调用?因此资源初始化泄漏.

__attribute__((destructor))
static void destroy()
Run Code Online (Sandbox Code Playgroud)
  1. 如果应用程序退出,dylib会自动卸载吗?
  2. 如果应用程序退出,是否会自动卸载注入的dylib?
  3. 我们如何在运行时从应用程序中卸载dylib?作为它的注入代码,我可以访问私有区域.有命令这样做吗?

c++ macos gcc code-injection dylib

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

在iOS上的sqlite3中"没有这样的功能:REGEXP"

是否可以在添加regexp功能的情况下重建libsqlite3.dylib?或者使用create_sqlite_function来做到这一点?

regex sqlite dylib ios

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

如何为SmartCard配置PCSCD

我是PCSC驱动程序开发的新手,我有一台Mac OSX 10.8.4(山狮),它有PCSC Framework 1.4.0版.

我有一个智能卡,我有库或c代码,我可以读取和写入卡(即获得ATR等)

我想知道配置PCSC的过程,以便PCSCD识别智能卡

我试图创建一个与卡通信的c代码的dylib(动态库),并在/etc/reader.conf中创建了一个条目,并将dylib放在指定的路径中.但是当我做pcscd -afd时,我仍然无法得到任何回复(即获得ATR).

任何建议或链接都​​会有所帮助

macos driver dylib smartcard pcsc

5
推荐指数
0
解决办法
667
查看次数

在App Bundle中使用Dylibs

我正在尝试使用Xcode编译使用多个库的应用程序.为此,我创建了一个脚本,将我.dylibs从计算机上的所有位置Frameworks复制到应用程序包中的文件夹.添加必要的经过linker flagsheader search paths我现在必须加我library search paths.

由于我已经复制了我的应用程序包的Frameworks文件夹中的所有库,因此我推断出我必须添加$(FRAMEWORKS_FOLDER_PATH)到该library search paths设置中.添加此项失败,因为链接器无法找到该目录.

我猜测Frameworks直到搜索完library search paths设置后才会创建该文件夹.如果是这样,我应该如何使用我在我的应用程序包中复制的库?

xcode linker dylib

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

如何在应用程序中使用dylib文件?

我创建了lib.dylib动态库.我想在我的应用程序中使用该库.什么是构建设置和构建阶段设置是必需的?在objective-c中使用库的步骤.

xcode objective-c dylib

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

通过动态链接在Mac OSX上用OpenMP编译C ++

摘要

如何以可移植的方式在Mac OSX上使用OpenMP编译C ++代码?

有许多资料来源建议在OSX上使用OpenMP编译C ++的解决方案,例如:

他们中的大多数建议安装更新的LLVM / Clang(或GCC),而不是默认的Clang。在OSX 10.12.6(Sierra)上,使用LLVM(通过brew install llvm)对我有效。

但是,生成的二进制文件似乎不可移植。如果可能的话,我想提供一个二进制文件,这样我的用户就不必自己编译。

这是我尝试过的

运行otool -L my_binary收益

/usr/local/opt/llvm/lib/libomp.dylib (compatibility version 5.0.0, current version 5.0.0)
/usr/local/opt/llvm/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
/usr/lib/libc++abi.dylib (compatibility version 1.0.0, current version 307.2.0)
Run Code Online (Sandbox Code Playgroud)

前两行看起来并不像我可以将二进制文件交给某些用户,并希望它能工作。用户必须先安装LLVM。

因此,我发现install_name_tool可以改变这一点。参见https://blogs.oracle.com/dipol/dynamic-libraries,-rpath,-and-mac-os

因此,我跑了

cp /usr/local/opt/llvm/lib/libomp.dylib .
cp /usr/local/opt/llvm/lib/libc++.1.dylib .

install_name_tool -change /usr/local/opt/llvm/lib/libomp.dylib @executable_path/libomp.dylib my_binary
install_name_tool -change /usr/local/opt/llvm/lib/libc++.1.dylib @executable_path/libc++.1.dylib my_binary

install_name_tool -id "@loader_path/libomp.dylib" …
Run Code Online (Sandbox Code Playgroud)

c++ macos openmp dylib

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

在工作空间中编译时,dylib无法加载libstd

我有一个具有以下结构的项目:

Cargo.toml
my_script.py
my_lib:
    - Cargo.toml
    - src
my_bin:
    - Cargo.toml
    - src
Run Code Online (Sandbox Code Playgroud)

哪里:

  • my_lib 是一个Rust库 crate-type = ["dylib"]
  • my_bin 是一个Rust二进制应用程序,使用 my_lib
  • my_script.py 是Python 3脚本,也使用 my_lib

根目录Cargo.toml包含一个基本的工作区声明:

[workspace]
members = [
    "my_lib",
    "my_bin"
]
Run Code Online (Sandbox Code Playgroud)

如果我执行cargo build和,一切都会正常进行cargo run -p my_bin。问题来自Python脚本。

在此脚本中,我my_lib使用以下代码加载lib文件:

[workspace]
members = [
    "my_lib",
    "my_bin"
]
Run Code Online (Sandbox Code Playgroud)

如果我使用库目录./my_lib/target/...)中的库文件,则脚本在加载库和执行其功能时没有问题。

但是,如果我使用工作空间目录./target/...)中的库文件,则在尝试加载库时出现以下错误:

from ctypes import cdll
from sys import platform

if platform == 'darwin':
    prefix = 'lib' …
Run Code Online (Sandbox Code Playgroud)

python macos dylib rust rust-cargo

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