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

Cha*_*ani 5 build cmake

set_target_properties(MyTarget PROPERTIES IMPORTED_LOCATION_RELEASE 
                       ${_IMPORT_PREFIX}/lib/mysharedlibrary.so)
Run Code Online (Sandbox Code Playgroud)

将添加该共享库。但是,我想添加多个共享库。

我尝试了以下方法:

set_target_properties(MyTarget PROPERTIES IMPORTED_LOCATION_RELEASE 
                       "${_IMPORT_PREFIX}/lib/mysharedlibrary_1.so" 
                       "${_IMPORT_PREFIX}/lib/mysharedlibrary_2.so")
Run Code Online (Sandbox Code Playgroud)

但这行不通。

squ*_*les 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"
)
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用该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}"
)
Run Code Online (Sandbox Code Playgroud)

第三个选项是使用set_property(),它允许您将每个库作为单独的参数列出,这可能有助于提供更正确的格式:

set_property(TARGET MyTarget PROPERTY
    IMPORTED_LOCATION_RELEASE 
    ${_IMPORT_PREFIX}/lib/mysharedlibrary_1.so
    ${_IMPORT_PREFIX}/lib/mysharedlibrary_2.so
)
Run Code Online (Sandbox Code Playgroud)

  • 我正在尝试传递库文件进行链接。如果我按照您所说的操作,在我的编译步骤中,cmake 会将其解释为“$PREFIX/lib/mysharedlib_1.so;$PREFIX/lib/mysharedlib_2.so”。但我真正想要的是`$PREFIX/lib/mysharedlib_1.so $PREFIX/lib/mysharedlib_2.so`。请注意,我什至不想要“” (2认同)

Kam*_*Cuk 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)
Run Code Online (Sandbox Code Playgroud)