所以,我正在构建一个项目,它使用编译库(.dylib或.so)中的函数.我在适当的位置有头文件和库文件(这是QtRoot,btw的所有部分),但是当我尝试在Xcode中构建我的项目时,我得到一个调试器错误:
dyld:未加载库:@ rpath/libRIO.so引用自:/ Users/paulthompson/Documents/Programming/Build Products/Debug/MacHeliosSim.app/Contents/MacOS/MacHeliosSim原因:找不到图像sharedlibrary apply-load-rules all数据格式化程序暂时不可用,将在"继续"后重试.(目前无法调用加载程序,它被锁定.)
现在,如果我从Finder中打开它,那么构建的程序本身就可以正常运行,但每当我尝试从Xcode运行它时,它就会对我产生影响.什么是这个rpath的东西,为什么调试器找不到库,即使Xcode本身知道它们在哪里,显然从Finder运行的程序也可以找到它们?
我正在尝试使用cmake构建python扩展.这是cmake列表:
cmake_minimum_required(VERSION 2.8)
PROJECT(drtile)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
find_package(Vigra REQUIRED)
find_package(Boost COMPONENTS python REQUIRED)
find_package(PythonLibs REQUIRED)
find_package(Numpy REQUIRED)
include_directories(
${VIGRA_INCLUDE_DIR}
${PYTHON_NUMPY_INCLUDE_DIR}
${Boost_INCLUDE_DIR}
${PYTHON_INCLUDE_DIRS}
${PYTHON_INCLUDE_PATH}
)
add_library(drtile SHARED drtile.cpp)
message("xxx ${Boost_PYTHON_LIBRARY} ${VIGRA_NUMPY_CORE_LIBRARY}${VIGRA_NUMPY_IMPEX_LIBRARY}")
target_link_libraries(drtile ${Boost_PYTHON_LIBRARY} ${VIGRA_NUMPY_CORE_LIBRARY} ${PYTHON_LIBRARY})
IF(WIN32)
SET_TARGET_PROPERTIES(drtile PROPERTIES OUTPUT_NAME "drtile" PREFIX "" SUFFIX ".pyd")
ELSE()
SET_TARGET_PROPERTIES(drtile PROPERTIES OUTPUT_NAME "drtile" PREFIX "" SUFFIX ".so")
ENDIF()
Run Code Online (Sandbox Code Playgroud)
该库已正确编译和链接,但当我用otool查看喜欢的库时,我得到:
otool -L drtile.so
drtile.so:
/Users/lfiaschi/phd/workspace/lazyflow/lazyflow/drtile/drtile.so (compatibility version 0.0.0, current version 0.0.0)
libboost_python.dylib (compatibility version 0.0.0, current version 0.0.0)
vigranumpycore.so (compatibility version 0.0.0, current version 0.0.0)
/Users/lfiaschi/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility …
Run Code Online (Sandbox Code Playgroud) 我正在使用cmake创建包
我有以下结构
bin/
bin1
lib/
lib1
lib2
Run Code Online (Sandbox Code Playgroud)
其中lib1和lib2是外部动态库.如何设置RPATH以便它自动链接lib1和lib2?
我们如何在MacOS上的CMake中设置目标上的多个RPATH目录?在Linux上,我们可以使用以冒号分隔的列表:
set_target_properties(mytarget
PROPERTIES
INSTALL_RPATH "\$ORIGIN/../lib:\$ORIGIN/../thirdparty/lib"
)
Run Code Online (Sandbox Code Playgroud)
在MacOS上,我们可以在技术上添加冒号分隔列表并otool -l
显示它,但不搜索这些目录:
set_target_properties(mytarget
PROPERTIES
INSTALL_RPATH "@loader_path/../lib:@loader_path/../thirdparty/lib"
)
Run Code Online (Sandbox Code Playgroud)
通常情况下,如果我要在MacOS上有多个RPATH目录,我会发送多个链接器标志,这些标志将单独显示otool -l
.就像是:
g++-mp-4.7 mytarget.cpp -o mytarget -Wl,-rpath,@loader_path/../lib,-rpath,@loader_path/../thirdparty/lib
Run Code Online (Sandbox Code Playgroud)
这使:
Load command 15
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib (offset 12)
Load command 16
cmd LC_RPATH
cmdsize 48
path @loader_path/../thirdparty/lib (offset 12)
Run Code Online (Sandbox Code Playgroud)
如何使用CMake重新创建此行为?
我有一个带有几个自定义动态框架的应用程序,这意味着我在Xcode 6.2上使用iOS 8作为SDK.我的Mac在Yosemite上.框架具有Swift源和资源.
该应用程序是分布式企业,因此我只需创建一个IPA并通过用户可以下载和安装应用程序的网页进行内部分发.
该应用程序在iPhone 5(iOS 8.1.2),iPod Touch(iOS 8.2)和模拟器上安装并运行,但不适用于iPhone 6(iOS 8.1.2).错误始终是dyld:未加载库:@ rpath/Custom.framework /.每当我删除并添加框架以尝试修复它时,另一个框架会弹出,因为iPhone 6上没有加载.(为什么!!!)
设置如下:
是什么导致了这些问题,我该怎么做才能确保应用程序在所有设备和iOS 8版本上一致运行.
我发现的大多数解决方案都是试错建议.
我目前正在使用Xcode 8.1,可可豆荚1.2.0.beta.1,并在iOS 10.1的模拟器上启动我的应用程序.我的应用程序构建得很好,但是在模拟器中启动应用程序后,我收到以下错误:
dyld: Library not loaded: @rpath/AFNetworking.framework/AFNetworking
Referenced from: /Users/XXXXX/Library/Developer/CoreSimulator/Devices/XXXXX/data/Containers/Bundle/Application/XXXXX/XXXXX.app/XXXXX
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
我的Podfile是:
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
platform :ios, '8.0'
target "XXXXX" do
platform :ios, '8.0'
use_frameworks!
pod 'AFNetworking'
...
end
post_install do | installer |
require 'fileutils'
FileUtils.cp_r('Pods/Target Support Files/Pods-XXXXX/Pods-XXXXX-acknowledgements.plist', 'Pods-Acknowledgements.plist', :remove_desve_destination => true)
end
Run Code Online (Sandbox Code Playgroud)
我已经尝试过去集成并重新安装我的可可豆荚,将Pods-XXXXX.framework更改为可选,禁用Bitcode,以及清理工作区.这些选项(或它们的任意组合)都没有奏效.任何帮助深表感谢.
在CentOS 7.2,我已经建立了与G ++ 4.8.5应用程序,因为它不能找到一个库,无法运行确实存在的runpath
。我很确定它在两周前有效。什么可能导致这种情况?
$ ./app
./app: error while loading shared libraries: libhdf5.so.9: cannot open shared object file: No such file or directory
$ ldd ./app | grep libhdf5
libhdf5.so.9 => not found
$ readelf app -d | grep path
0x000000000000001d (RUNPATH) Library runpath: [/opt/ProductName/lib:/opt/ProductName/lib/private]
$ ll /opt/ProductName/lib/libhdf5.so*
lrwxrwxrwx. 1 fotechd fotechd 16 Oct 26 14:38 /opt/ProductName/lib/libhdf5.so -> libhdf5.so.9.0.0
lrwxrwxrwx. 1 fotechd fotechd 16 Oct 26 14:38 /opt/ProductName/lib/libhdf5.so.9 -> libhdf5.so.9.0.0
-rwxr-xr-x. 1 fotechd fotechd 3316074 Oct …
Run Code Online (Sandbox Code Playgroud) 我的项目使用 Xcode 11.3.1,结构如下:
MyProject
- MyProject.xcworkscapce
- MyFramework
- MyApp
-MyApp (main-target)
-MyAppUITests (uiTest-target)
Run Code Online (Sandbox Code Playgroud)
MyAppMyFramework
可以导入并且可以很好地构建和运行。为此,我将MyFramework
main-target添加到 main-targets General/Frameworks 和 Libraries 中。
在我的 UITest 目标中,我需要从 访问一些类(Accessibility-Identifier-Definitions)MyFramework
,所以我需要以某种方式导入这些类。
两个目标都在构建中,主要目标正常工作没有任何问题。我还可以在模拟器上运行 ui-tests。不幸的是,我被迫在真实设备上运行我的测试,在这里我得到了这个运行时错误:
The bundle “MyAppUITests” couldn’t be loaded because it is damaged or missing necessary resources. Try reinstalling the bundle.
(dlopen_preflight(/var/containers/Bundle/Application/E581B3BA-A9A2-4AA3-A1BA-91C57DCD3846/MyAppUITests-Runner.app/PlugIns/MyAppUITests.xctest/FHCommunityUITests): Library not loaded: @rpath/MyFramework.framework/MyFramework
Referenced from: /var/containers/Bundle/Application/E581B3BA-A9A2-4AA3-A1BA-91C57DCD3846/MyAppUITests-Runner.app/PlugIns/MyAppUITests.xctest/MyAppUITests
Reason: image not found)
Run Code Online (Sandbox Code Playgroud)
我对这个框架事物(以及 ui-tests)相当陌生,我现在处理这个问题已经两天了。大多数关于类似问题的帖子都与错误指定的 Podfile 相关,但在我设置为不破坏我的真实项目的准系统示例项目中,我没有使用任何 Pod。我可能尝试了所有建议的解决方案(以及几乎所有组合:(),但它们似乎都不起作用。
我花了一段时间才弄清楚,在我的 uiTest-target构建阶段中,我实际上可以添加一个新的运行脚本阶段,并且我假设我需要以某种方式将 MyFramework 链接到这里。这样对吗?有人可以帮我定义运行脚本吗? …
我gcc-4.7.2
在我的环境中定制了。系统 gcc 是gcc-4.3.4
.
我已经为所有自定义 gcc 的二进制文件和共享库修补了RUNPATH使用patchelf --set-rpath
但是,当我ldd
在 4.7.2 上运行时,cc1
它会选择系统libstdc++
而不是RUNPATH指向的系统:
$ ldd /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/4.7.2/cc1
libcloog-isl.so.1 => /sdk/x86_64/2.11.1/gcc-4.7.2/lib/libcloog-isl.so.1 (0x00007f072dce8000)
...
libc.so.6 => /lib64/libc.so.6 (0x00007f072bfe0000)
--> libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f072bcd5000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f072babe000)
/lib64/ld-linux-x86-64.so.2 (0x00007f072df0d000)
Run Code Online (Sandbox Code Playgroud)
可以看出RUNPATH指定了gcc-4.7.2
库位置:
$ readelf -a /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/4.7.2/cc1 | grep PATH
0x000000000000001d (RUNPATH) Library runpath: \
[/sdk/x86_64/2.11.1/gcc-4.7.2/lib64: \
/sdk/x86_64/2.11.1/gcc-4.7.2/lib: \
/sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/lib64: \
/sdk/x86_64/2.11.1/gcc-4.7.2/lib/gcc/x86_64-suse-linux/4.7.2: \
/hostname/sig/lib64: \
/hostname/sig/lib]
Run Code Online (Sandbox Code Playgroud)
我知道libstdc++.so.6
存在于RUNPATH …
我正在尝试解决使用 Rust 加载外国库的问题。
输入:
我有一个可执行文件rtest
和一个 dylib libcpp2rs.dylib
。该库通过 FFI 链接到可执行文件:
#[link(name="cpp2rs")]
extern { ... }
Run Code Online (Sandbox Code Playgroud)
我的build.rs
文件(我传递了一个带libcpp2rs.dylib
位置的额外参数):
pub fn main() {
println!("cargo:rustc-link-search=native=./cpplib/bin");
}
Run Code Online (Sandbox Code Playgroud)
还有我的Cargo.toml
文件:
[package]
name = "rtest"
version = "0.1.0"
authors = ["astavonin"]
build = "build.rs"
rpath = true
[dependencies]
libc = "0.2.10"
Run Code Online (Sandbox Code Playgroud)
我使用cargo build
命令进行编译。
输出:
otool
向我显示库将通过以下方式加载RPATH
:
> otool -L rtest
rtest:
@rpath/libcpp2rs.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
Run Code Online (Sandbox Code Playgroud)
但同时 …