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

在OS X中创建和使用动态库 我们有C++编写的Windows应用程序,其中的一部分我们试图移植到Mac OS X。我们的目标是将业务逻辑封装到一些库中,并在控制器和GUI上构建一个COOCAA层。我们可能会有几个小的应用程序使用相同的库,所以我们的第一个想法是使用C++代码的动态库(除非有更好的方法)。 然而,我们在实现这一目标方面遇到了一些问题。我们的动态库很好(至少看起来是这样),我们在应用程序中链接到一个.dylib文件。问题是,我们的应用程序根本找不到我们试图包含的任何.h文件。 我们已经检查了.h文件是否正在导出,以及安装名称,并确保库位于正确的目录中。此外,我们遵循了苹果的动态库创建和使用指南,没有发现我们遗漏的任何特殊步骤,c++,xcode,macos,dylib,dynamic-library,C++,Xcode,Macos,Dylib,Dynamic Library,我的问题分为两部分: 是否有一些明显的步骤我们可能会遗漏,这有助于暴露我们应该先尝试的接口(即.h文件) 我们确实怀疑这个错误可能是我们在这个项目中继承的蹩脚的C++代码。例如,有许多逻辑(方法的实现)直接写在.h文件中,在某些情况下甚至根本没有对应的.cpp文件。因此.h文件不仅仅是对接口的描述。这可能不是(严重的)问题,因为我们的应用程序甚至无法从库中找到.h文件,它们至少应该存在。 我们真的希望避免重写大量代码,因为需要移植的代码库非常大,而且(通常)截止日期很近 PS:到目前为止,我们只

我的问题分为两部分:

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

    选项1

    在本例中,我只是将包含头的目录添加到Xcode中头或库的发现路径中。根据布局的不同,某些方法将优于其他方法

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

    • 标题搜索路径
    • LIBRARY\u SEARCH\u路径
    • USER\u HEADER\u SEARCH\u path
    • FRAMEWORK\u SEARCH\u路径
    哪个选项正确取决于您使用的库(例如,这些选项也会影响链接器)。定义发现路径时,可以添加后缀
    **
    ,以表示递归搜索

    这是非常理想的,因为在保持xc项目与其vs解决方案同步时,您会遇到较少的问题

    选项2

    有些人真的喜欢一些拖放支持他们的包括。。。我不知道,但是如果有太多的混乱,你不能简单地添加搜索路径,那么这就是方法:

    • 将所需的标题添加到项目中
    • 将这些标头添加到目标的复制标头生成阶段
    • 重复此操作,直到它生成并准备在合并/拉取它们的更新时被破坏

    很快就会变得一团糟,如果头文件名中存在冲突,则需要花费数小时重新构建库。

    确保在项目/目标的生成设置中指定了库的包含文件的路径:头文件搜索路径或用户头文件搜索路径。确保头文件位于预期位置(在文件系统中)实际上,我们这样做是出于纯粹的绝望,而且有点奏效。但这真的有必要吗?我的意思是,这意味着,当您分发库时,您也必须分发头文件。因此.dylib的工作方式与Windows中完全自包含的.dll文件不同?在这种情况下,我们应该研究取而代之的是框架(如果我理解正确的话,它也会打包头文件)。当我们想在多个应用程序中使用它时,会有什么影响?@NobleK您不需要在应用程序中提供头文件。另一方面,如果您要将库提供给其他开发人员使用,那么是的,您也需要提供头文件,并且您可以使用框架。谢谢您的回答,无论是在这里还是在中以上是您的评论。