我在Xcode中使用info.plist来设置环境变量,DYLD_LIBRARY_PATH和DYLD_FRAMEWORK_PATH。
我将DYLD_LIBRARY_PATH设置为
$ CONTENTS_FOLDER_PATH /运行/ 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ tiapp / 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ ticodec / 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ tidatabase / 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ tifilesystem / 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ timedia / 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ timonkey / 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ tinetwork / 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ tiplatform / 1.1.0: $ CONTENTS_FOLDER_PATH /模块/ tiprocess / 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ tiui / 1.1.0:$ CONTENTS_FOLDER_PATH /模块/ tiworker / 1.1.0
和
DYLD_FRAMEWORK_PATH到
$ CONTENTS_FOLDER_PATH /运行/ 1.1.0
当我双击我的.app文件夹时,dlopen找不到上面文件夹中引用的任何.dylib。
如果我采用相同的变量和路径并将它们放在Xcode的可执行参数中,一切正常,但只有当我通过Xcode运行软件时,我才需要在点击.app文件夹时一切正常
我在info.plist中做错了什么?它不喜欢$ CONTENTS_FOLDER_PATH吗?它需要一个不同的分隔符吗?为什么相同的参数在可执行参数中有效但在info.plist文件中不起作用?
提前致谢。
答案 0 :(得分:2)
您在Info.plist
中使用什么键来设置环境变量?你的意思是你在Xcode的“环境变量”配置中设置环境变量(Xcode 4中的Scheme的一部分,Xcode 3中自定义可执行文件的一部分),或者你的意思是你只是将键/值放入{{ 1}}并期望它们出现在环境中?
在前一种情况下,即使这样有效,它只会在您运行Xcode时有用,而不是在您运送产品时。在后一种情况下,Info.plist
没有根据我的知识添加环境变量的机制。
就个人而言,我没有在你的捆绑包中放置这个巨大的树,而是让Xcode将你所有的dylib复制到你的bundle的插件目录(Info.plist
)中,然后使用PlugIns
(或{{1获取它的路径。或者你可以使用另一个目录,如果它们不是真正的“插件”。但是将它们全部放在捆绑包中的一个目录中。不要搜索它们。 (您可以自由地将它们放在源树中的许多目录中;这完全是关于捆绑包。)
答案 1 :(得分:0)
我最终使用@rpath来查找我的所有dylib和框架。我使用@ rpath / -name of library或framework-的安装名重建了所有框架和库。
然后我在主项目的运行搜索路径设置中添加了相对路径名,如@loader_path /../ runtime / 1.1.0和@loader_path /../ modules /等...
这允许dlopen调用在不使用plist或可执行参数的情况下查找当前路径。