Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Build 具有set_target_属性的FindPkgConfig无法用于设置CFLAGS/LDFLAGS_Build_Cmake_Pkg Config - Fatal编程技术网

Build 具有set_target_属性的FindPkgConfig无法用于设置CFLAGS/LDFLAGS

Build 具有set_target_属性的FindPkgConfig无法用于设置CFLAGS/LDFLAGS,build,cmake,pkg-config,Build,Cmake,Pkg Config,FindPkgConfig中的pkg\u check\u模块给出了MYLIBRARY\u LDFLAGS和MYLIBRARY\u CFLAGS,它们是普通的CMake列表(带有分号分隔符) set\u target\u properties和set\u property只接受一个字符串 这不起作用,因为它不会扩展列表: set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY LINK_FLAGS ${MYLIBRARY_LDFLAGS}) 这与内

FindPkgConfig中的
pkg\u check\u模块
给出了
MYLIBRARY\u LDFLAGS
MYLIBRARY\u CFLAGS
,它们是普通的CMake列表(带有分号分隔符)

set\u target\u properties
set\u property
只接受一个字符串

这不起作用,因为它不会扩展列表:

set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY LINK_FLAGS ${MYLIBRARY_LDFLAGS})
这与内部的分号给出了相同的结果:

set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY LINK_FLAGS "${MYLIBRARY_LDFLAGS}")
set\u target\u properties
在不带引号时扩展为多个字符串,在带引号时扩展为一个带分号的字符串


我该如何使用它呢?

我不确定这是否就是它的用途,但这应该是有效的:

string(REPLACE ";" " " MYLIBRARY_LDFLAGS "${MYLIBRARY_LDFLAGS}")
set_property(TARGET ${PROJECT_NAME} APPEND_STRING PROPERTY LINK_FLAGS " ${MYLIBRARY_LDFLAGS}")
string(REPLACE)
命令将更改由空格分隔的字符串中的列表,因此您可以将其用于
LINK\u FLAGS
属性


“${MYLIBRARY\u LDFLAGS}”中预设的空格
APPEND\u字符串
而不是
APPEND
将确保生成的字符串可用作
链接\u标志
,即使属性不是空的。

在CMake中通过pkg config搜索库的通用工作流:

# Use pkg-config for search library `xxx`.
pkg_check_modules(XXX xxx)

# Build target which uses given library

# The only command which has no target-oriented equivalent.
# But see comments after the code.
link_directories(${XXX_LIBRARY_DIRS}) 

# Two global commands belows can be replaced by target-oriented equivalent
# after creation of the target.
include_directories(${XXX_INCLUDE_DIRS})
add_compile_options(${XXX_CFLAGS_OTHER})

# Create target
add_executable(my_exe ...) # Or add_library()

# The only target-oriented command, which has no global equivalent.
target_link_libraries(my_exe ${XXX_LDFLAGS_OTHER}) # It is OK to have link flags here
target_link_libraries(my_exe ${XXX_LIBRARIES}) # Can be combined with previous call.
注意,我们使用
XXX\u LDFLAGS\u OTHER
变量而不是
XXX\u LDFLAGS
one。这是因为
XXX\u LDFLAGS
包括
-l
-l
选项,CMake对这些选项有更合适的命令。使用
XXX\u CFLAGS\u OTHER
的类似原因


目前,CMake不建议使用命令,而是使用调用中库的绝对路径。可以使用以下命令提取pkg config列出的库的绝对路径:


@Tsyvarev,基本的东西必须在没有黑客的情况下工作。@Velkan:“基本的东西”是将
LINK\u FLAGS
(和
COMPILE\u FLAGS
)空间分隔开。但您可以将它们生成为分号分隔。这就是为什么您需要
string(REPLACE)
操作的原因。@Tsyvarev,FindPkgConfig会以分号分隔生成它们。@Velkan:Oops,对不起。我现在才注意到您问题中变量的来源。“要点”是
我应该如何使用它?
,所以对于接受空格分隔列表的属性,您应该如何使用分号分隔列表。
...
# Instead of using `link_directories`, collect absolute paths to libraries.
set(XXX_LIBS_ABSOLUTE)
foreach(lib ${XXX_LIBRARIES})
    # Choose name of variable, which will contain result of `find_library`
    # for specific library.
    set(var_name XXX_${lib}_ABS)
    # Search library under dirs, returned by pkg-config.
    find_library(${var_name} ${lib} ${XXX_LIBRARY_DIR})
    list(APPEND XXX_LIBS_ABSOLUTE ${${var_name}})
endforeach()

# Instead of `target_link_libraries(my_exe ${XXX_LIBRARIES})`
target_link_libraries(my_exe ${XXX_LIBS_ABSOLUTE})