跨平台构建,标准目录结构,环境变量

时间:2010-10-04 16:29:16

标签: c++ windows cross-platform cmake libraries

我已经开始使用CMake作为跨平台命令行程序的构建工具,该程序需要FFTW3和Boost.Format。我熟悉已安装库的头文件和二进制文件的类似Unix的标准目录结构,但我想知道Windows平台上的准标准是关于库的安装,组织等的方式和位置。是否有任何准标准我可以在我的CMakeLists.txt / FindXXX.cmake脚本中使用环境变量来查找库?我应该在哪里将FFTW3标头和二进制文件放在Windows平台上?在Windows机器上安装像pkg-config这样的东西是否有意义?显然,我不想对库的路径进行硬编码,因此它只能在具有完全相同目录结构的Windows机器上运行。

TIA, sellibitze

3 个答案:

答案 0 :(得分:1)

Windows的默认安装路径通常类似于C:\Program Files\<company name>\<app name>\C:\Program Files\<app name>\。但是,FFTW以zip文件的形式出现,由用户决定放在哪里。我可能会让CMake查找模块检查前面提到的两个点,如果没有找到任何内容,请发出信息性消息。

也许其他人会有更好的建议。

答案 1 :(得分:0)

CMake有一个有趣的功能是它会保留您在./configure命令行中为非标准库位置指定的值的缓存。

我的做事方式如下:

  • 如果库附带了安装程序,例如OpenSSL的Windows版本,我会将其安装在推荐的文件夹中,即。 C:\ Program Files \ OpenSSL
  • 如果库是zip格式的,我通常会在 C:\ dev 目录下解压缩,以便进一步迁移,并使文件夹更短,更容易找到。< / LI>

然后,在编译我的基于CMake的项目时,我运行图形工具来生成CMakeCache.txt文件,而不是关心未能找到我的外部库的FindXXX模块触发的错误。

相反,我将使用CMake GUI浏览头文件和库文件所在的目录,并手动设置正确的文件夹。只要未删除缓存,即使修改了CMakeLists.txt文件,这些路径仍将保留在CMakeCache.txt中。

在某些情况下,已安装的库会设置环境变量,CMake模块可以使用这些变量来定位它们,例如Boost(BOOST_ROOT变量)。这样就可以很容易地在带有CMake的窗口中使用已安装的Boost,如下所示:

##### Boost libraries #####
include(FindBoost)

if(MSVC)
  find_package(Boost 1.40.0 REQUIRED) # msvc autolink support means we don't specify libs
else(MSVC)
  find_package(Boost 1.40.0 REQUIRED COMPONENTS system)
endif(MSVC)

include_directories(${Boost_INCLUDE_DIRS})
set(Boost_USE_STATIC_LIBS ON)

link_directories(${Boost_LIBRARY_DIRS})

然后,您可以将您的可执行文件与Boost链接,执行以下操作:

add_executable(program_example program_example.cpp)
target_link_libraries(program_example ${Boost_LIBRARIES})

答案 2 :(得分:-1)

您是否考虑过为Windows目标安装cygwin?这至少可以解决遵守什么标准的问题。