相关疑难解决方法(0)

如何在cmake中打印目标的所有属性?

使用以下cmake scrpt:

get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
    message(STATUS "${_variableName}=${${_variableName}}")
endforeach()
Run Code Online (Sandbox Code Playgroud)

我们可以打印CMake项目中的所有变量.然后我的问题是:是否有一个可以打印目标的所有属性的函数?

cmake

40
推荐指数
3
解决办法
2万
查看次数

CMAKE如何获取目标文件位置

我正在尝试获取另一个项目的静态库的位置.我试过了

get_property(target_name TARGET Test PROPERTY LOCATION)但CMAKE给出以下错误

CMake Error at project.cmake:6 (get_property):
The LOCATION property may not be read from target "A".
Use the target name directly with add_custom_command, or use the generator
expression $<TARGET_FILE>, as appropriate.
Run Code Online (Sandbox Code Playgroud)

我试图使用错误消息中提到的生成器表达式但没有成功.

MESSAGE($<TARGET_FILE:A>)
Run Code Online (Sandbox Code Playgroud)

只输出完全相同的字符串,因此似乎根本不评估生成器表达式:

$<TARGET_FILE:A>
Run Code Online (Sandbox Code Playgroud)

我阅读了文档.在第一行中提到:

在构建系统生成期间评估生成器表达式,以生成特定于每个构建配置的信息.

如果我正确地理解了这一点,那么在评估消息函数时,不再评估生成器表达式了吗?那么在这种情况下我应该做些什么呢?

我在GitHub上提供了这个问题的最小例子

编辑:

我很遗憾在没有明确解释我的意图的情况下以如此迂回的方式提出这个问题:

我的目标是让CMake 为我的项目构建单个(!)静态库,其他人(不使用CMake)可以使用.我仍然会对我的项目使用"正常"的依赖关系解析,但另一个人 - 不使用CMake - 必须手动将多个库链接到他的项目,这有点不方便.单个库可以解决这个问题.

在尝试让CMake静态链接两个静态库的过程中,我在某处阅读(抱歉,我还没有保存链接),至少在使用Visual Studio作为编译器时,如果我追加了它,我可以得到我想要的结果要链接到静态链接器标志的静态库的完整路径,如下所示:

set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS >>>INSERT_PATH_HERE<<<)
Run Code Online (Sandbox Code Playgroud)

这实际上工作.但是现在我必须在那里手动插入变量的完全限定路径

set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS "/path/to/library.lib")
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不是一个"好"的方式.所以我尝试了生成器表达式并想出了以下内容:

set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS $<TARGET_FILE:A>)
Run Code Online (Sandbox Code Playgroud)

由于我不完全理解的原因,这不起作用.我猜set_target_properties只是不支持生成器表达式.在尝试让我的项目工作时,我试过了

MESSAGE($<TARGET_FILE:A>)
Run Code Online (Sandbox Code Playgroud)

(如上所述)并认为如果我得到这个陈述,我可以解决我的真正问题.这就是我问上面提到的问题.我没有意识到这会让那些试图回答我的人感到困惑.

cmake

5
推荐指数
1
解决办法
5793
查看次数

如何在CMake中显示Foo::Bar的内容?

我想用 CMake 显示 Foo::Bar 的内容。怎么做?

message(STATUS "Foo::Bar -> ${Foo::Bar}")

# example case : Boost
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost REQUIRED)

# I want to display contents of Boost::headers.
# I think it is contain header path. How to display it on CMake output?
# message(STATUS "Boost::headers -> ${Boost::headers}")
# I expect the following output.
# Boost::headers -> (path_to_boost_root)/include/boost-1_70
Run Code Online (Sandbox Code Playgroud)

cmake

2
推荐指数
1
解决办法
1315
查看次数

标签 统计

cmake ×3