如何在CMake的set_target_properties()函数中将多个项目添加到同一属性?

5
set_target_properties(MyTarget PROPERTIES IMPORTED_LOCATION_RELEASE 
                       ${_IMPORT_PREFIX}/lib/mysharedlibrary.so)

将共享库添加进去。但是,我希望添加多个共享库。

我尝试了以下方法:

set_target_properties(MyTarget PROPERTIES IMPORTED_LOCATION_RELEASE 
                       "${_IMPORT_PREFIX}/lib/mysharedlibrary_1.so" 
                       "${_IMPORT_PREFIX}/lib/mysharedlibrary_2.so")

但是这并不起作用。

CMake中的列表只是用“;”分隔的字符串。尝试使用"${_IMPORT_PREFIX}/lib/mysharedlibrary_1.so;${_IMPORT_PREFIX}/lib/mysharedlibrary_2.so" - arrowd
请您能否看一下这个问题的答案和我的评论? - Chani
2个回答

7
因为 set_target_properties() 可以在一次调用中设置多个属性,所以您需要将跟随 IMPORTED_LOCATION_RELEASE 的参数合并为一个参数。为了实现这一点,您可以将库连接成分号分隔的列表:
set_target_properties(MyTarget PROPERTIES IMPORTED_LOCATION_RELEASE
    "${_IMPORT_PREFIX}/lib/mysharedlibrary_1.so;${_IMPORT_PREFIX}/lib/mysharedlibrary_2.so"
)

或者,你可以使用 set() 命令来为你创建列表。你可以把这些库设置成一个变量,然后让列表变量在 set_target_properties() 调用中展开:

set(MY_SHARED_LIBS
    "${_IMPORT_PREFIX}/lib/mysharedlibrary_1.so" 
    "${_IMPORT_PREFIX}/lib/mysharedlibrary_2.so"
)

set_target_properties(MyTarget PROPERTIES 
    IMPORTED_LOCATION_RELEASE "${MY_SHARED_LIBS}"
)

第三种选择是使用set_property(),它允许你将每个库作为单独的参数列出,这可能有助于提供更正确的格式:
set_property(TARGET MyTarget PROPERTY
    IMPORTED_LOCATION_RELEASE 
    ${_IMPORT_PREFIX}/lib/mysharedlibrary_1.so
    ${_IMPORT_PREFIX}/lib/mysharedlibrary_2.so
)

2
我正在尝试传递库文件以进行链接。如果我按照你在这里的建议操作,在我的编译步骤中,cmake将其解释为"$PREFIX/lib/mysharedlib_1.so;$PREFIX/lib/mysharedlib_2.so"。但实际上我想要的是 $PREFIX/lib/mysharedlib_1.so $PREFIX/lib/mysharedlib_2.so。请注意,我甚至不想要 "" - Chani
@Chani 好的,当你说“但这不起作用”时,你的问题有些模糊,但现在你的目标更加清晰了。我在我的答案中添加了第三个选项,可能会有助于解决你所看到的格式问题。 - Kevin
第三个选项对我来说不起作用,至少在VS2019中是这样。 - undefined

6
IMPORTED_LOCATION_RELEASE指定单个文件的位置。您可以创建两个目标,然后链接它们。
add_library(mysharedlibrary_1 SHARED IMPORTED)
set_target_properties(mysharedlibrary_1 PROPERTIES 
         IMPORTED_LOCATION_RELEASE ${_IMPORT_PREFIX}/lib/mysharedlibrary_1.so)

add_library(mysharedlibrary_2 SHARED IMPORTED)
set_target_properties(mysharedlibrary_2 PROPERTIES
          IMPORTED_LOCATION_RELEASE ${_IMPORT_PREFIX}/lib/mysharedlibrary_2.so)

add_library(MyTarget INTERFACE)
target_link_libraries(MyTarget INTERFACE mysharedlibrary_1 mysharedlibrary_2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接