【问题标题】:How do I write system-independent code when there are paths involved?当涉及到路径时,如何编写与系统无关的代码?
【发布时间】:2014-07-14 14:01:11
【问题描述】:

假设我正在创建一个使用某个库的项目,我必须在链接时提供该库的路径。在命令行或makefile中我可能有:

g++ ... -L/path/to/mylibrary

我还将把这个项目发送给其他想要使用它的人。他们系统上的路径可能不一定与我的相同。他们可能一起使用不同的文件路径。

如何确保库的路径适用于我的计算机和项目的接收者?

【问题讨论】:

  • 确保在 makefile 中有 LIBDIR = /path/to/mylibrary 作为定义,并且在 makefile 的链接规则中使用 -L${LIBDIR}。同样,您应该为可能需要更改的所有内容使用宏(例如,您需要为您的 C++ 编译器名称使用宏——通常是 CXX)。如果需要,您的同事可以编辑 makefile 中的宏定义或运行 make LIBDIR=/other/path/to/library
  • 同样你应该使用 ${CXX} 而不是直接使用 g++。另请注意,make 有很多隐含规则,您应该使用它们

标签: c++ path linker makefile


【解决方案1】:

这是构建系统或构建配置工具的作用。周围有很多这样的人。主要的可能是CMake,因为它具有非常广泛的功能集、跨平台且被广泛采用。还有其他的,例如Boost.Jamautoconf 等。

这些工具的使用方式是它们具有自动脚本,用于查看文件系统并查找您需要的头文件或库,即编译代码所需的依赖项。它们还可以用来做各种其他花哨的事情,比如检查操作系统支持的功能并因此重新配置构建。但关键是,您不会将任何文件路径硬编码到构建配置中,所有内容要么与您的源文件夹相关,要么由构建脚本自动找到。

这是一个使用 Boost 的项目的示例 CMake 文件:

cmake_minimum_required (VERSION 2.8)
project (ExampleWithBoost)

find_package(Boost 1.46 COMPONENTS thread program_options filesystem REQUIRED)

# Add the boost directory to the include paths:
include_directories(SYSTEM ${Boost_INCLUDE_DIR})
# Add the boost library directory to the link paths:
link_directories(${Boost_LIBRARY_DIRS})

# Add an executable target (for compilation):
add_executable(example_with_boost example_with_boost.cpp)
# Add boost libraries to the linking on the target:
target_link_libraries(example_with_boost ${Boost_LIBRARIES})

find_package cmake 函数只是一个特殊的脚本(专门用于 Boost,并与 CMake 一起安装),它会查找系统上安装的最新版本的 boost(具有一些最小版本),并且它会根据文件执行此操作-name 库使用的模式。您还可以编写自己的 find_package 等效项,甚至您自己的包查找器,使用 CMake 提供的用于在文件系统中搜索某些文件名模式(例如,正则表达式)的函数。

如您所见,上面的构建配置文件仅直接引用您的源文件,例如“example_with_boost.cpp”,并且它仅与源文件夹相关。如果你做对了,配置脚本几乎可以在 CMake 支持的任何系统和任何操作系统上运行(以及你所依赖的库支持)。这是大多数主要跨平台项目的工作方式,当您了解如何使用这些系统时,它非常强大且非常易于使用(通常,比您逐点构建配置更容易使用且无故障- 并在 IDE 菜单中单击,如在 Visual Studio 中)。

【讨论】:

    【解决方案2】:

    您可以使用生成跨平台makefile的premake:Visual Studio、Gcc等

    http://industriousone.com/what-premake

    CMake 是另一种选择

    http://www.cmake.org/

    【讨论】:

      【解决方案3】:

      我不确定是否有一种通用的方法来执行此操作,但人们经常提供不同的配置文件并让主 Makefile 检测要包含哪个:linux.makedarwin.makecygwin.make 等。

      还有各种工具,例如 CMake,可以自动执行此操作,但总而言之,它只是对开发人员隐藏系统依赖性的脚本。

      【讨论】:

      • 这是不够的,因为请注意所有 darwin 系统或 linux 系统看起来都一样。它也缺少所有的 bsds。
      • g(nu)make 也可用于其他系统,通常用于端口。只有进入 BSD 基础系统的东西必须使用 BSD make afaik
      猜你喜欢
      • 2018-10-29
      • 2014-10-23
      • 2016-10-24
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多