繁体   English   中英

当涉及路径时,如何编写与系统无关的代码?

[英]How do I write system-independent code when there are paths involved?

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

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

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

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

这是构建系统或构建配置工具的角色。 周围有许多人。 主要的可能是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(带有一些最小版本),并且它基于文件名模式来实现。图书馆使用。 您还可以使用CMake为搜索文件系统提供的某些文件名模式(例如,正则表达式)提供的函数编写自己的find_package等效find_package ,甚至是您自己的包查找程序。

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

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

http://industriousone.com/what-premake

CMake是另一种选择

http://www.cmake.org/

我不确定是否有一种通用的方法可以做到这一点,但人们经常提供不同的配置文件,让主​​Makefile检测哪一个包括: linux.makedarwin.makecygwin.make等。

还有像CMake这样的各种工具允许自动执行此操作,但总而言之,它只是隐藏了开发人员对系统的依赖性的脚本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM