FindPkgConfig с set_target_properties непригоден для установки CFLAGS/LDFLAGS.

pkg_check_modules из FindPkgConfig дает MYLIBRARY_LDFLAGS и MYLIBRARY_CFLAGS, которые являются обычными списками CMake (с точкой с запятой).

set_target_properties и set_property принимают только одну строку.

Так что это не работает, потому что не расширяет список:

set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY LINK_FLAGS ${MYLIBRARY_LDFLAGS})

Это дает то же самое с точкой с запятой внутри:

set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY LINK_FLAGS "${MYLIBRARY_LDFLAGS}")

set_target_properties расширяется в несколько строк, если не заключен в кавычки, и в одну строку с точкой с запятой, когда заключен в кавычки.

Как я должен использовать это?


person Velkan    schedule 17.02.2016    source источник


Ответы (2)


Общий рабочий процесс с поиском библиотек с помощью pkg-config в CMake:

# 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_LDFLAGS_OTHER вместо переменной XXX_LDFLAGS. Это связано с тем, что XXX_LDFLAGS включает параметры -l и -L, для которых в CMake есть более подходящие команды. Аналогичная причина использования XXX_CFLAGS_OTHER.


В настоящее время CMake не рекомендует использовать команду link_directories, но использовать абсолютные пути к библиотекам в вызове target_link_libraries. Можно извлечь абсолютные пути к библиотекам, перечисленные pkg-config, с помощью команда find_library:

...
# 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})
person Tsyvarev    schedule 18.02.2016

Я не уверен, что именно так он предназначен для использования, но это должно работать:

string(REPLACE ";" " " MYLIBRARY_LDFLAGS "${MYLIBRARY_LDFLAGS}")
set_property(TARGET ${PROJECT_NAME} APPEND_STRING PROPERTY LINK_FLAGS " ${MYLIBRARY_LDFLAGS}")

Команда string(REPLACE) изменит список в строке, разделенной пробелами, и поэтому вы можете использовать ее для свойства LINK_FLAGS.

Предварительно добавленный пробел в " ${MYLIBRARY_LDFLAGS}" и APPEND_STRING вместо APPEND гарантируют, что результирующая строка может использоваться как LINK_FLAGS, даже если свойство не пусто.

person Daniele E. Domenichelli    schedule 17.02.2016
comment
@Tsyvarev, базовые вещи должны работать без хаков. - person Velkan; 17.02.2016
comment
@Velkan: Главное, чтобы LINK_FLAGSCOMPILE_FLAGS) разделялись пробелами. Но вы генерируете их как разделенные точкой с запятой. Вот почему вам нужна string(REPLACE) операция. - person Tsyvarev; 17.02.2016
comment
@Tsyvarev, FindPkgConfig генерирует их через точку с запятой. - person Velkan; 18.02.2016
comment
@Velkan: Ой, извините. Только сейчас я отмечаю происхождение переменных в вашем вопросе. - person Tsyvarev; 18.02.2016
comment
точка How am I supposed to use that?, так что вы должны использовать список, разделенный точкой с запятой, для свойства, которое принимает список, разделенный пробелом. - person Daniele E. Domenichelli; 18.02.2016