我正在尝试获取另一个项目的静态库位置。我尝试使用get_property(target_name TARGET Test PROPERTY LOCATION),但是CMAKE会给出以下错误。
我试图使用错误消息中提到的生成器表达式,但并没有成功。
我看过了文档。在第一行中提到:
生成器表达式在构建系统生成期间进行评估,以产生特定于每个构建配置的信息。
如果我理解正确,那么当消息函数得到评估时,生成器表达式就不再进行评估了?那么在这种情况下我应该做什么?
我在GitHub上提交了这个问题的最小示例。
编辑:
很抱歉以这样迂回的方式提出问题,并没有清晰地说明我的意图:
我的目标是让CMake为我的项目构建一个单一 (!) 静态库,这个静态库可以被其他人(不使用CMake的人)使用。我仍然会使用“正常”的依赖关系解析来构建我的项目,但另一个人——不使用CMake——将不得不手动链接多个库到他的项目中,这有些不方便。一个单独的库将解决这个问题。
在尝试将CMake静态链接两个静态库的过程中,我在某个地方读到(抱歉,我没有保存链接),至少在使用Visual Studio作为编译器时,如果将要链接的静态库的完整路径附加到静态链接器标志中,就可以得到我想要的结果:
实际上这有效。但现在我必须手动插入变量的完全限定路径。
由于我并没有完全理解,所以它无法正常工作。我猜测set_target_properties不支持生成器表达式。在尝试使我的项目正常工作时,我尝试了以下方法。
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.
我试图使用错误消息中提到的生成器表达式,但并没有成功。
MESSAGE($<TARGET_FILE:A>)
只是输出完全相同的字符串,因此生成器表达式似乎根本没有被评估:
$<TARGET_FILE:A>
我看过了文档。在第一行中提到:
生成器表达式在构建系统生成期间进行评估,以产生特定于每个构建配置的信息。
如果我理解正确,那么当消息函数得到评估时,生成器表达式就不再进行评估了?那么在这种情况下我应该做什么?
我在GitHub上提交了这个问题的最小示例。
编辑:
很抱歉以这样迂回的方式提出问题,并没有清晰地说明我的意图:
我的目标是让CMake为我的项目构建一个单一 (!) 静态库,这个静态库可以被其他人(不使用CMake的人)使用。我仍然会使用“正常”的依赖关系解析来构建我的项目,但另一个人——不使用CMake——将不得不手动链接多个库到他的项目中,这有些不方便。一个单独的库将解决这个问题。
在尝试将CMake静态链接两个静态库的过程中,我在某个地方读到(抱歉,我没有保存链接),至少在使用Visual Studio作为编译器时,如果将要链接的静态库的完整路径附加到静态链接器标志中,就可以得到我想要的结果:
set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS >>>INSERT_PATH_HERE<<<)
实际上这有效。但现在我必须手动插入变量的完全限定路径。
set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS "/path/to/library.lib")
对我来说,这似乎不是一种“好”的方式。因此,我尝试使用生成器表达式,并得出了以下结论:
set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS $<TARGET_FILE:A>)
由于我并没有完全理解,所以它无法正常工作。我猜测set_target_properties不支持生成器表达式。在尝试使我的项目正常工作时,我尝试了以下方法。
MESSAGE($<TARGET_FILE:A>)
如上所述,我认为如果我能让那个陈述句起作用,就可以解决我的实际问题。这就是我提出上面问题的原因。我没有意识到这会导致回答我的人感到困惑。