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

时间:2014-05-25 19:37:18

标签: c++ path linker makefile

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

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

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

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

3 个答案:

答案 0 :(得分:3)

这是构建系统或构建配置工具的角色。周围有许多人。主要的可能是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等效项,甚至是您自己的包查找程序。

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

答案 1 :(得分:0)

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

http://industriousone.com/what-premake

CMake是另一种选择

http://www.cmake.org/

答案 2 :(得分:0)

我不确定是否有单一的通用方式,但人们经常提供不同的配置文件,让主​​Makefile检测哪一个包括:linux.make,{{1 },darwin.make等。

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