我试图获取另一个项目的静态库的位置。我试过了
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.
我尝试使用错误消息中提到的生成器表达式但没有成功。
MESSAGE($<TARGET_FILE:A>)
只输出完全相同的字符串,因此生成器表达式似乎根本没有被评估:
$<TARGET_FILE:A>
我读了Documentation。在第一行中提到:
在生成构建系统期间,评估生成器表达式 特定于每个构建配置的信息。
如果我正确理解了这一点,那么在评估消息函数时,不再评估生成器表达式了吗?那么在这种情况下我应该怎么做呢?
我在GitHub
上提供了此问题的最小示例编辑:
很抱歉,在没有明确解释我的意图的情况下,以如此迂回的方式提出问题:
我的目标是让CMake为我的项目构建一个单个(!)静态库,其他人(不使用CMake)可以使用。我仍然会使用&#34; normal&#34;解决我的项目的依赖关系,但另一个人 - 谁没有使用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")
它似乎不是一个好的&#34;这样做对我来说。所以我尝试了生成器表达式,并提出了以下一个:
set_target_properties(B PROPERTIES STATIC_LIBRARY_FLAGS $<TARGET_FILE:A>)
由于我不完全理解的原因,它不起作用。我猜set_target_properties不支持生成器表达式。在尝试让我的项目工作时,我尝试了
MESSAGE($<TARGET_FILE:A>)
(如上所述)并且认为如果我得到该陈述,我可以解决我的真正问题。这就是我问上面提到的问题。我没有意识到这会让那些试图回答我的人感到困惑。
答案 0 :(得分:2)
如果要在另一个库中使用库,则应使用target_link_libraries函数:
target_link_libraries(B A)
target_link_libraries
的签名会自动将A
传播到使用B
(直接和间接)的所有非静态库和可执行文件中。
使用B
的静态库知道它们对A
的依赖性,但它们不会拥有来自A
的对象文件的副本。依赖关系信息在库的INTERFACE_LINK_LIBRARIES
和LINK_LIBRARIES
目标属性中携带。
按照设计,静态库只是目标文件的存档。如果您只想在CMake项目中使用库,则无需手动将来自不同库的目标文件混合在一起。 CMake将向您的链接器指示需要链接到库的库列表以及库的正确顺序(实际上是从依赖图生成的)。反过来,链接器将解析所提供的静态库中携带的目标文件中的所有符号。
如果您仍需要精确控制混合对象文件,可以考虑使用OBJECT library type:
# Create plain objects library which essentially is a set of object files
add_library(zipobj OBJECT zip.cpp)
# Archive all objects from zipobj. Recompilation of zip.cpp won't take place.
add_library(zip STATIC $<TARGET_OBJECTS:zipobj>)
add_library(lzmaobj OBJECT lzma.zpp)
add_library(lzma STATIC $<TARGET_OBJECTS:lzmaobj>)
# Create a library which contains object files from both zipobj and lzmaobj
add_library(archive STATIC $<TARGET_OBJECTS:zipobj> $<TARGET_OBJECTS:lzmaobj>)
编辑: 您也可以尝试merge_libraries函数: http://www.mail-archive.com/cmake@cmake.org/msg28670.html