簡體   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