Как изменить порядок Libs в файле cmake?

58
5

Требуется порядок ссылок. Я заметил, что когда я скомпилирую свою программу с помощью:

gcc 'pkg-config --cflags --libs gtk+-2.0' program.cpp -o program

который создает ряд ошибок компоновщика: "неопределенная ссылка на" _gtk_init_abi_check "и другие. Это можно устранить, указав входной файл перед библиотеками.

gcc program.cpp 'pkg-config --cflags --libs gtk+-2.0' -o program

Мой вопрос:

Как я могу исправить проблему такого характера, когда я использую файл Cmake? Вот содержимое простого файла cmake, который я использую в настоящее время.

cmake_minimum_required(VERSION 2.6)

project(program)

add_executable(program
program.cpp
)

EXEC_PROGRAM(pkg-config ARGS --cflags --libs gtk+-2.0
OUTPUT_VARIABLE GTK2_PKG_FLAGS)
SET(GTK2_PKG_FLAGS CACHE STRING "GTK2 Flags" "${GTK2_PKG_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GTK2_PKG_FLAGS}")

Теперь, когда я делаю cmake за которым следует make я получаю те же ошибки компоновщика, что и первая строка выше, поэтому я знаю, что мои проблемы с компоновщиками строго связаны с порядком. Итак, как мне изменить порядок ссылок при использовании pkg-config в файле cmake? Я пробовал переупорядочить части моего файла cmake, но, похоже, я не считаю правильный порядок.

спросил(а) 2013-08-01T22:25:00+04:00 7 лет, 3 месяца назад
1
Решение
81

В команде вы передали как аргументы --cflags и --libs которые будут давать обе части -I и -L файла.pc в одной переменной.

Попробуйте запустить message("${GTK2_PKG_FLAGS}") для печати содержимого.

Следовательно, может быть неразумно связывать полную переменную $ GTK2_PKG_FLAGS с использованием target_link_libraries().

Вы также можете попробовать выполнить следующие шаги

    INCLUDE(FindPkgConfig)
pkg_check_modules(GTK REQUIRED gtk+-2.0)

#include
include_directories(${GTK_INCLUDE_DIRS})

#link
link_directories(${GTK_LIBRARY_DIRS})
target_link_libraries(program ${GTK_LIBRARIES})

Отправить вопрос

ответил(а) 2013-08-02T07:12:00+04:00 7 лет, 2 месяца назад
57

Ага! После долгих поисков и проб и ошибок я, наконец, получил его для работы, добавив следующие строки в мой файл cmake CMakeLists.txt:

target_link_libraries(program
${GTK2_PKG_FLAGS}
)

И, используя некоторые советы от пользователя2618142, я улучшил его. Функция pkg_check_modules() для меня почему-то не работает. Я получаю Unknown CMake command "pkg_check_modules" но, используя следующий файл mycmake, все работает так, как ожидалось.

cmake_minimum_required(VERSION 2.6)

project(program)

exec_program(pkg-config ARGS --cflags gtk+-2.0 OUTPUT_VARIABLE GTK_FLAGS)
exec_program(pkg-config ARGS --libs gtk+-2.0 OUTPUT_VARIABLE GTK_LIBS)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GTK_FLAGS}")

add_executable(program
program.cpp
)

target_link_libraries(program
${GTK_LIBS}
)

ответил(а) 2013-08-02T02:36:00+04:00 7 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема