发布网友 发布时间:2022-04-22 05:25
共1个回答
热心网友 时间:2022-06-22 23:10
如果你想编写软件编制,在不同操作系统上运行,你必须对不同平台的特殊性质的照顾。在不同的操作系统有细微的差别,例如在FreeBSD你不应该使用malloc.h,而这是完全可以在Linux上使用它。处理这些差异通常是通过提供一个头文件,它包含了定义,根据平台性能报表,通常命名为config.h中一堆:
1#定义HAVE_MALLOC_H
/ *#民主 基金HAVE_SYS_MNTTAB_H 1 * /
/ *#民主基金HAVE_SYS_MNTENT_H 1 * /
1#定义HAVE_SYS_MOUNT_H
然后,这个头文件包含在源文件和妥善处理:
foo.c的:
#include “config.h”
#ifdef HAVE_MALLOC_H
#include
#else
#include
#endif
无效do_something()
(
*缓冲区=无效的malloc(1024);
...
)
对config.h中的内容取决于所在的来源是编译平台,因此需要有一种方法来生成这个头文件在实际编制过程开始。如果您使用的自动工具为基础的软件,你可能知道。/ configure这一步,已经开始做之前必须执行。在。/ configure脚本做一些系统的反思,并从收集信息的config.h头文件生成。 CMake是能够做到的一样,我会告诉你如何去做。
此外以内建的命令,通过提供的CMake CMake的脚本文件,称为模块实现更多的命令。这些文件位于CMake的模块目录,在UNIX系统默认是这个/ USR的/地方/股/的CMake /单元。
若要使用这些模块的命令,他们必须在的CMakeLists.txt中。 CMake的来了,他们都遵循一个例子CHECK_INCLUDE_FILES同一风格,以检查系统的几个模块:
包括(CheckIncludeFiles)
#用法:CHECK_INCLUDE_FILES( )
CHECK_INCLUDE_FILES(malloc.h HAVE_MALLOC_H)
CHECK_INCLUDE_FILES(“系统/ param.h;系统/ mount.h”HAVE_SYS_MOUNT_H)
CONFIGURE_FILE($(CMAKE_CURRENT_SOURCE_DIR)/ $(CMAKE_CURRENT_BINARY_DIR config.h.in)/ config.h中)
CMake的模块CheckIncludeFiles提供了命令CHECK_INCLUDE_FILES()。的第一个参数此命令是头部,你要检查。第二个参数是变量将包含结果。如果给定的头被发现,它被设置为1,否则是空的。如果另一头是需要使用的头,你所寻找的,你要列出头文件用分号隔开,你可以在上面看到。要查看CHECK_INCLUDE_FILES()到底,有一个在执行看看吧:/ usr /本地/共享/ CMake的/模块/ CheckIncludeFiles.cmake。在那里你会看到它试图编译一个简单的源文件,其中包括指定的头文件。该测试的结果存储在文件CMakeCache.txt,所以如果你想检查后测试是否成功或不看在CMakeCache.txt文件:
/ /有包括HAVE_MALLOC_H
HAVE_MALLOC_H:内部= 1
只要长期的结果缓存,测试将不会被再次执行。如果你想让它再一次被执行,或者删除该文件CMakeCache.txt,那么所有的测试将再次执行,或者仅仅删除的变量,你希望有再次测试的项目。这样可以节省一些时间。如果测试失败,你要找出原因,打开CMakeFiles / CMakeError.log和标题名称(或功能等)搜索你测试。在那里你会看到代码无法编译或链接时,编译命令和错误信息。连同在CheckIncludeFiles.cmake测试实现你应该能够找出什么地方出了错。
好了,现在我们已经测试是否如malloc.h存在,并在cmake的变量HAVE_MALLOC_H因此,我们仍然要创建一个头的config.h。要做到这一点,我们使用cmake的命令CONFIGURE_FILE(),正如你上面看到的。这将复制源文件到目标文件并编辑它,而这样做,详见手册页。因此,我们写了一个源文件名为config.h.in,但你可以给它的任何您想要的名称(它也通常命名为config.h.in autotools的):
1#cmakedefine HAVE_MALLOC_H
#cmakedefine HAVE_SYS_MOUNT_H
现在,当CMake的运行,它将取代#cmakedefine。如果HAVE_MALLOC_H和HAVE_SYS_MOUNT_H是真的,它会产生的config.h:
1#定义HAVE_MALLOC_H
#定义HAVE_SYS_MOUNT_H
如果两个都是假的,这将产生:
/ *#民主基金HAVE_MALLOC_H 1 * /
/ *#定义HAVE_SYS_MOUNT_H * /
通过包括这头到您的源文件,您可以检查这些属性使用#ifdef。这种检查可以插入在任何项目中的CMakeLists.txt不仅在顶层的CMakeLists.txt。如果您有多个配置的头,你不应该把它们命名为所有的config.h,这可能导致与包含路径的问题。最好给他们喜欢的config.h名称,配置为在配置子目录富头foo.h /和配置,在酒吧/子目录,等等bar.h
用cmake的未来进行系统检查其他命令按照这种风格,所以我们可以处理它们更短了。
模块
包括(CheckIncludeFiles)
用法
CHECK_INCLUDE_FILES(标头变量)
范例
CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H)
正如刚才冗长的讨论,这可以用来检查一个头的存在。
模块
包括(CheckFunctionExists)
用法
CHECK_FUNCTION_EXISTS(函数变量)
范例
CHECK_FUNCTION_EXISTS(madvise HAVE_MADVISE)
检查是否存在给定的函数。这是通过将一个小程序,它可能不会导致未定义的引用。
模块
包括(CheckSymbolExists)
用法
CHECK_SYMBOL_EXISTS(符号标题变量)
范例
CHECK_SYMBOL_EXISTS((LC_MESSAGES“locale.h中”HAVE_LC_MESSAGES)
检查是否存在给定的符号,如果指定的标头也包括在内。
模块
包括(CheckLibraryExists)
用法
CHECK_LIBRARY_EXISTS(库函数的位置变量)
范例
CHECK_LIBRARY_EXISTS(volmgt volmgt_running“”HAVE_VOLMGT)
检查是否存在给定的库和包含给定的函数。这是通过将一个小程序,它使用功能和图书馆的链接。在一个额外的链接位置参数目录(- Ldir)如果需要的话可以考虑。
模块
包括(CheckTypeSize)
用法
套装(CMAKE_EXTRA_INCLUDE_FILES头)
CHECK_TYPE_SIZE(类型变量)
套装(CMAKE_EXTRA_INCLUDE_FILES)
范例
设定(CMAKE_EXTRA_INCLUDE_FILES sys / socket.h中)
CHECK_TYPE_SIZE(“结构ucred”STRUCT_UCRED)
套装(CMAKE_EXTRA_INCLUDE_FILES)
检查是否存在指定的类型和返回类型的大小。在变量的类型的大小将被退回,另外一个变量HAVE_STRUCT_UCRED将被设置为true,如果存在的类型。请不要认为你必须设置CMAKE_EXTRA_INCLUDE_FILES为这种类型所需的头文件,你应该调用CHECK_TYPE_SIZE后重置它。如果你是不是真的有兴趣在该类型的大小,但只有它是否存在与否,你也可以使用STRUCT_UCRED直接,如果类型不存在,这将是空的,所以也计算为假(如将HAVE_STRUCT_UCRED )。
模块
包括(CheckPrototypeExists)
用法
CHECK_PROTOTYPE_EXISTS(函数头变量)
范例
CHECK_PROTOTYPE_EXISTS(mkstemps“stdlib.h中; unistd.h”HAVE_MKSTEMPS_PROTO)
头检查是否为给定函数的声明,即不检查是否使用功能将导致未定义的引用。
模块
包括(CheckCXXSourceCompiles)
包括(CheckCSourceCompiles)
用法
CHECK_CXX_SOURCE_COMPILES(源变量)
CHECK_C_SOURCE_COMPILES(源变量)
检查是否在给定的源代码将编译和链接。您可以设置CMAKE_REQUIRED_LIBRARIES,CMAKE_REQUIRED_FLAGS和CMAKE_REQUIRED_INCLUDES因此,如果额外的库或编译器标志是必需的。
转载