Build 具有set_target_属性的FindPkgConfig无法用于设置CFLAGS/LDFLAGS
FindPkgConfig中的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}) 这与内
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})