Вопрос

Я пытался создать систему сборки на основе CMake для проекта, который должен использовать библиотеку SDL2_image.Я не хочу заставлять пользователя устанавливать какие-либо библиотеки в систему, чтобы иметь возможность собрать проект, поэтому я воспользовался возможностью CMake загружать и создавать зависимости (freetype, SDL2 и SDL2_image) из исходного кода в качестве внешних проектов.

Все в порядке с freetype и SDL2 (которые оба включают CMakeLists.txt файлы из коробки), но у меня закончились идеи, как заставить его работать с SDL2_image.Внешние проекты CMake поддерживают пользовательскую конфигурацию и параметры сборки, которые я безуспешно использовал в разных вариантах.

Сам файл CMake можно найти здесь, но проблема вот в чем:

# SDL_image library
ExternalProject_Add(sdl2_image_project
    URL https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.0.tar.gz
    DEPENDS sdl2_project
    PREFIX ${LIBS_DIR}/SDL2_image
    CONFIGURE_COMMAND LDFLAGS=-L${SDL2_BIN} CFLAGS=-I${SDL2_SRC}/include SDL2_CONFIG=${SDL2_BIN}/sdl2-config <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> --enable-shared=no
    BUILD_COMMAND make
    INSTALL_COMMAND ""
)

Ан ошибка происходит при построении sdl2_image_project.Некоторые тривиальные исследования показали, что ошибка возникает из-за неопределенных ссылок на части libdl.Вот крошечная часть ошибки отверстия:

libtool: link: gcc -I/home/snikitin/_src/img_glypher/libs/SDL2/src/sdl2_project/include -I/usr/local/include/SDL2 -D_REENTRANT -o showimage showimage.o -Wl,-rpath -Wl,/usr/local/lib -pthread  -L/home/snikitin/_src/img_glypher/libs/SDL2/src/sdl2_project-build ./.libs/libSDL2_image.a -L/usr/local/lib -lSDL2 -pthread
/home/snikitin/_src/img_glypher/libs/SDL2/src/sdl2_project-build/libSDL2.a(SDL_dynapi.c.o): In function `get_sdlapi_entry':
/home/snikitin/_src/img_glypher/libs/SDL2/src/sdl2_project/src/dynapi/SDL_dynapi.c:227: undefined reference to `dlopen'

Я думаю, проблема возникает из-за того, что компоновщик пытается создать общую версию библиотеки SDL2_image, привязывая ее к статической libSDL2.a.Дело в том, что если это верно, то на этапе сборки SDL2 создаются как статические, так и общие версии самого себя, поэтому можно предположить, что компоновщик будет использовать libSDL2-2.0.so вместо этого (на самом деле мне не нужна общая библиотека - только статическая, но я не знаю, как запретить системе сборки пытаться создать ее отдельно от передачи --enable-shared=no в скрипт настройки SDL2_image, который в данном случае не помогает).

После долгих поисков в Google я обнаружил, что возможный источник проблемы заключается в том, что sdl2-config (который вызывается для получения некоторых флагов для компилятора во время сборки SDL_image) может вызываться с неправильными аргументами и создавать неправильные cflags, которые сбивают с толку все остальное.Но я не уверен, что это так и не знаю, как на это повлиять. sdl2_config вызов из CMake (configure --help похоже, не раскрывает никаких полезных вариантов для этой ситуации).

Я использую Ubuntu 14.04 x64, если это имеет какое-либо значение.Буду признателен за любой совет!

Это было полезно?

Решение

Похоже, вам нужно связать некоторые библиотеки, например m и dl.Это может быть исправлено, предоставляя пользовательский sdl2-config файл.Копировать sdl2-config из распакованного архива и подставить --libs результат:

--libs)
  echo -L${exec_prefix}/lib -Wl,-rpath,${libdir} -pthread -lSDL2 -lm -ldl
  ;;

Обратите внимание, что порядок важен (поэтому простое изменение LIBS у меня не работает).Теперь этот файл можно использовать в вашем ExternalProject_Add команда вместо SDL2_CONFIG=${SDL2_BIN}/sdl2-config:

...
... CFLAGS=-I${SDL2_SRC}/include SDL2_CONFIG=${CMAKE_CURRENT_LIST_DIR}/sdl2-config <SOURCE_DIR>/configure
...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top