【问题标题】:Cross-Platform Building, Standard Directory Structures, Environment Variables跨平台构建、标准目录结构、环境变量
【发布时间】:2010-10-04 16:29:15
【问题描述】:
我已经开始将 CMake 用作需要 FFTW3 和 Boost.Format 的跨平台命令行程序的构建工具。我熟悉已安装库的标头和二进制文件的类 Unix 标准目录结构,但我想知道 Windows 平台上关于库的安装、组织方式和位置等的准标准是什么。是否有任何准标准我可以在 CMakeLists.txt / FindXXX.cmake 脚本中使用环境变量来查找库吗?我应该将 FFTW3 标头和二进制文件放在 Windows 平台上的什么位置?在 Windows 机器上安装 pkg-config 之类的东西有意义吗?显然,我不想对库的路径进行硬编码,因此它只能在具有完全相同目录结构的 Windows 机器上运行。
TIA,
推销
【问题讨论】:
标签:
c++
windows
cross-platform
cmake
libraries
【解决方案1】:
Windows 的默认安装路径通常类似于 C:\Program Files\<company name>\<app name>\ 或 C:\Program Files\<app name>\。但是,FFTW 以 zip 文件的形式出现,由用户决定将其放在何处。我可能会让 CMake 查找模块检查上述两个位置,如果没有找到,则吐出一条信息性消息。
也许其他人会有更好的建议。
【解决方案2】:
CMake 有一个有趣的功能,它可以缓存您在 ./configure 命令行中为非标准库位置指定的值。
我的做事方式如下:
- 如果该库带有安装程序,例如 Windows 版本的 OpenSSL,我会将其安装在推荐的文件夹中,即。 C:\Program Files\OpenSSL。
- 如果库以 zip 格式提供,我通常将它们解压缩到 C:\dev 目录下,以便于进一步迁移并使文件夹更短,更易于键入和查找。
然后,在编译我的 CMake 驱动的项目时,我运行图形工具来生成 CMakeCache.txt 文件,而不关心 FindXXX 模块无法找到我的外部库所触发的错误。
然后,我将使用 CMake GUI 浏览头文件和库文件所在的目录,并手动设置正确的文件夹。只要不移除缓存,即使修改了 CMakeLists.txt 文件,这些路径也会保留在 CMakeCache.txt 中。
在某些情况下,已安装的库会设置 CMake 模块可以用来定位它们的环境变量,例如 Boost(BOOST_ROOT 变量)。这使得在带有 CMake 的 Windows 中使用已安装的 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})
【解决方案3】:
您是否考虑过需要为 windows 目标安装 cygwin ?这至少可以解决要遵守什么标准的问题。