首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与cmake一起使用常量文件夹

与cmake一起使用常量文件夹
EN

Stack Overflow用户
提问于 2015-11-17 13:57:55
回答 2查看 245关注 0票数 1

我的~/.bashrc文件中有一个常量的~/.bashrc

代码语言:javascript
复制
export MYPROJECT = /home/loom/my_project

我可以看到在终端中定义了常量:

代码语言:javascript
复制
loom@loom$ ls -ld $MYPROJECT
drwxr-xr-x 25 loom loom 4096 Jul 21 22:12 /home/loom/my_project

我尝试在我的CMakeLists.txt中使用常量

代码语言:javascript
复制
add_executable(booo src/main.cpp ${MYPROJECT}/foo/trunk/bar/File.h)

但是,它会产生一个错误:

代码语言:javascript
复制
CMake Error at CMakeLists.txt:17 (add_executable):
  Cannot find source file:

    /foo/trunk/bar/File.h

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx


CMake Error: CMake can not determine linker language for target: booo
CMake Error: Cannot determine link language for target "booo".

如果我在没有$MYPROJECT的情况下使用了显式路径,则它将被处理而没有错误。

代码语言:javascript
复制
add_executable(booo src/main.cpp /home/loom/my_project/foo/trunk/bar/File.h)

如何在cmake中使用.bashrc中定义的路径?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-17 14:08:31

而不是

代码语言:javascript
复制
add_executable(booo src/main.cpp ${MYPROJECT}/foo/trunk/bar/File.h)

使用

代码语言:javascript
复制
add_executable(booo src/main.cpp $ENV{MYPROJECT}/foo/trunk/bar/File.h)

CMake文档声明:

使用语法$ENV{ VAR }读取环境变量VAR。还请参见set()命令来设置ENV{VAR}。

https://cmake.org/cmake/help/v3.4/variable/ENV.html

票数 2
EN

Stack Overflow用户

发布于 2015-11-18 21:22:40

把我的评论变成回答

在CMake中有很多方法可以做到这一点。由于在CMake项目中直接使用环境变量的不良经验(它们不仅必须在第一次调用CMake配置/生成期间有效,而且在所有连续构建期间也必须有效),我建议将常量转换为缓存的CMake变量。

我在我的项目中使用了以下方法之一:

  1. 通过MYPROJECT CMake的-D option注射。 -DMYPROJECT:PATH=$MYPROJECT ..。 然后,CMake会将这个值缓存在它自己的MYPROJECT内部变量中。
  2. 当您从“外部”获取值时,您应该考虑如果没有提供值或者它不是一个有效的目录,应该做什么。抛出致命错误和/或使用默认值重试? 下面的示例只显示转换步骤和正常检查(没有默认值重试): 如果(未定义的MYPROJECT或NOT IS_DIRECTORY MYPROJECT)文件(TO_CMAKE_PATH "$ENV{ MYPROJECT }“_ENV_MYPROJECT_REL) get_filename_component(_ENV_MYPROJECT "${_ENV_MYPROJECT_REL}”绝对值) if (非_ENV_MYPROJECT)消息(FATAL_ERROR“未提供环境变量MYPROJECT”)。set() set(MYPROJECT "${_ENV_MYPROJECT}“缓存内部"")
  3. 使用find_path(),这也将缓存其结果: find_path( MYPROJECT_INCLUDE_DIR名称文件h路径ENV /home/织机/my_ PATH_SUFFIXES foo/PATH_SUFFIXES/bar)
  4. 或者-假设您的外部项目不仅由头文件组成,而且还包括像foo.a这样的库-遵循CMake的一个样本查找模块并通过以下方式扩展find_path()代码: find_library( MYPROJECT_LIBRARY NAMES foo PATHS PATH_SUFFIXES foo/lib ) if(MYPROJECT_INCLUDE_DIR和MYPROJECT_LIBRARY而不是目标MyProject:: MYPROJECT ) add_library(MyProject::MyProject未知导入) set_target_properties( MyProject::MYPROJECT_LIBRARY IMPORTED_LOCATION "${MYPROJECT_LIBRARY}“INTERFACE_INCLUDE_DIRECTORIES )${MYPROJECT_INCLUDE_DIR}) endif() 现在,您可以将其直接用作任何其他CMake目标。 add_executable(booo /main.cpp) target_link_libraries(booo::MyProject)

更多参考资料

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33758798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档