dan*_*jar 5 c++ cross-platform project cmake include
在跨平台项目中,我使用了许多第三方库.我最终决定将他们的源代码包含到我的存储库中,而不需要在每个平台上再次下载它们.这是许可证允许的.
要包含这些库中的标头,我需要指定它们的文件路径.有些库有它们,name/include/name/file.h但一般来说,每个库都有不同的目录结构.
我想在代码中包含标题,#include "name/file.h"其中name是库的名称.但是我既不想修改库的目录结构,也不想将所有头文件复制到我想要的结构的include目录中.
有没有办法定义包含目录别名?例如,Bullet Physics有它的标题bullet/src,Sqlite直接有标题sqlite,SFML包含它们sfml/include/SFML.我想指出这样的事情:
#alias "dependencies/bullet/src" "bullet"
#alias "dependencies/sqlite" "sqlite"
#alias "dependencies/sfml/include/SFML" "sfml"
Run Code Online (Sandbox Code Playgroud)
所以这#include "sfml/System.hpp"变得等同于
#include "dependencies/sfml/include/SFML/System.hpp".
该技术不必处于预处理阶段.例如,它也可以是以正确方式生成项目的CMake标志.但是,我认为编译器必须以某种方式了解这种技术,才能实现这一点.
没有; 最近的方法是-I命令行上的选项集合.
此外,如果您使用SFML,建议的表示法是#include "SFML/System.hpp"; 这就是你应该在你的代码中写的东西.然后修复编译环境,使其-Idependencies/sfml/include包含在编译中,或者使用符号链接(如果它们足够便携)来制作子目录,就像SFML在包含项目标题的主目录中一样.
当安装了像SFML这样的软件包时,标题将被放入一个目录中 - 通常/usr/local/include是默认情况下,通常放在那里的子目录中.也就是说,会有一个/usr/local/include/SFML包含SFML头的目录.其他软件包的机会也是如此.您应该在构建区域下的某个位置安装这些标头,以便可以正常找到标头 - 您只需指定include查找标头的基本目录.(注意:安装Bullet Physics库时,标题会放在一个.../include/bullet目录下面,其下面有各种子目录,所以它也遵循这个约定.)
否则意味着打击系统,当你与系统作战时,你最终会失败.简单地顺应潮流是一项艰巨的工作.
小智 5
我在一次构建运行中构建了所有内容(不是在包中),我通过执行以下操作,成功地使用 Cmake 完成了您想要的操作:
在最高的CMakeLists.txt中
set(TEMP_INCLUDE_DIR ${CMAKE_BINARY_DIR}/tempIncludes)
file(MAKE_DIRECTORY ${TEMP_INCLUDE_DIR})
target_include_directories(<TARGET_NAME> PUBLIC
$<BUILD_INTERFACE:${TEMP_INCLUDE_DIR}>
)
Run Code Online (Sandbox Code Playgroud)
这将在二进制目录中创建一个文件夹(当您清理项目时该文件夹将被删除,因此它不会修改您的实际文件夹结构,并且我假设您没有使用源内构建)
然后在目标库的 CMakeLists.txt 中:
set(LIB_NAME <ThirdPartyLibraryName>)
set(INCLUDE_FOLDER <WhatEverThirdPartyIncludeDirectory>)
set(HEADER_FILES
${INCLUDE_FOLDER}/<Header1>.h
${INCLUDE_FOLDER}/<Header2>.h
)
file(COPY ${HEADER_FILES} DESTINATION ${TEMP_INCLUDE_DIR}/${LIB_NAME}/)
Run Code Online (Sandbox Code Playgroud)
这将创建一个文件夹结构,其中所有包含文件都复制到标准目录中,这将允许您使用#include "name/file.h"所需的形式。
| 归档时间: |
|
| 查看次数: |
3081 次 |
| 最近记录: |