Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 跨平台构建、标准目录结构、环境变量_C++_Windows_Cross Platform_Cmake_Libraries - Fatal编程技术网

C++ 跨平台构建、标准目录结构、环境变量

C++ 跨平台构建、标准目录结构、环境变量,c++,windows,cross-platform,cmake,libraries,C++,Windows,Cross Platform,Cmake,Libraries,我已经开始使用CMake作为跨平台命令行程序的构建工具,该程序需要FFTW3和Boost.Format。我熟悉已安装库的头文件和二进制文件的类Unix标准目录结构,但我想知道Windows平台上的准标准是什么,库是如何安装、组织的,以及在何处安装、组织的,等等。在我的CMakeLists.txt/FindXXX.cmake脚本中是否有任何准标准环境变量可用于查找库?在Windows平台上,我应该将FFTW3头文件和二进制文件放在哪里?在Windows机箱上安装类似pkg config的东西有意义

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

蒂亚,
sellibitze

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

Windows的默认安装路径通常看起来像
C:\Program Files\\\\\
C:\Program Files\\\
。然而,FFTW是以zip文件的形式出现的,由用户决定放在哪里。我可能会让CMake find模块检查上述两个点,如果没有发现任何东西,则发出一条信息


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

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

我的做事方式如下:

  • 如果库附带安装程序,例如windows版本的OpenSSL,我会将其安装在推荐的文件夹中,即C:\Program Files\OpenSSL
  • 如果库是zip格式的,我通常将它们解压缩到C:\dev目录下,以便于进一步迁移,并使文件夹的键入时间更短,更易于查找
然后,在编译我的CMake项目时,我运行图形工具生成CMakeCache.txt文件,而不关心FindXXX模块触发的错误,这些模块找不到我的外部库

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

在某些情况下,安装的库设置了CMake模块可以用来定位它们的环境变量,如Boost(Boost_根变量)。这使得使用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})