在OS X中创建和使用动态库

时间:2011-10-26 06:51:32

标签: c++ xcode macos dylib dynamic-library

我们有一个用C ++编写的Windows应用程序,其中一部分是我们尝试移植到Mac OS X.我们的目标是将业务逻辑包装到一些库中,并在控制器和GUI的顶部构建一个Cocoa层。我们可能会有几个较小的应用程序使用相同的库,所以我们首先想到的是为C ++代码使用动态库(除非有更好的方法)。 但是,我们在实现这一目标时遇到了一些问题。我们的动态库符合要求(至少看起来像这样),我们得到一个.dylib文件,我们在应用程序中链接到该文件。问题是我们的应用程序根本无法找到我们试图包含的任何.h文件。 我们已经检查了.h文件是否正在导出以及检查安装名称并确保该库位于正确的目录中。此外,我们遵循Apple的创建和使用动态库的指南,并没有发现我们缺少的特殊步骤。

我的问题分为两部分:

  1. 我们可能会遗漏一些明显的步骤,这有助于暴露我们应该在其他任何事情之前尝试的界面(即.h文件)吗?
  2. 我们怀疑这个错误可能出现在我们在这个项目中继承的糟糕的C ++代码中。例如,有很多逻辑(方法的实现)直接写在.h文件中,在某些情况下根本没有相应的.cpp文件。因此.h文件不仅仅是对接口的描述。这可能不是(庄严)问题,因为我们的应用程序甚至无法从库中找到.h文件,它们应该至少存在。 我们真的希望我们可以避免重写很多代码,因为需要移植的代码库非常大而且(像往常一样)截止日期很接近。
  3. PS:到目前为止,我们只在Xcode 4.2中工作,还没有尝试使用命令行工具。

1 个答案:

答案 0 :(得分:1)

选项1

在这种情况下,我只需将包含标头的目录添加到Xcode中的标头或库的发现路径中。根据布局,某些方法会比其他方法更好。

通常,您将使用以下组合:

  • HEADER_SEARCH_PATHS
  • LIBRARY_SEARCH_PATHS
  • USER_HEADER_SEARCH_PATHS
  • FRAMEWORK_SEARCH_PATHS

哪一个是正确的取决于您使用的库(例如,这些选项也会影响链接器)。定义发现路径时,可以添加后缀**以表示递归搜索。

这是理想的,因为您可以减少使xc项目与其解决方案保持同步的麻烦。

选项2

有些人真的喜欢对其包含的拖放支持...我不这样做,但如果有太多的混乱,你不能只做一些简单的添加搜索路径的方法:

  • 将您需要的标题添加到项目中
  • 将这些标题添加到目标
  • 的复制标题构建阶段
  • 重复,直到它构建并在合并/提取更新时为破损做好准备。
如果标题名称中存在冲突,那么如果要重用库,则需要数小时才能重建。