CMAKE如何获取目标文件位置

时间:2014-11-18 10:17:43

标签: 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.

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

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>)

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

1 个答案:

答案 0 :(得分:2)

如果要在另一个库中使用库,则应使用target_link_libraries函数:

target_link_libraries(B A) 

target_link_libraries的签名会自动将A传播到使用B(直接和间接)的所有非静态库和可执行文件中。

使用B的静态库知道它们对A的依赖性,但它们不会拥有来自A的对象文件的副本。依赖关系信息在库的INTERFACE_LINK_LIBRARIESLINK_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