Pregunta

He estado intentando crear un sistema de compilación basado en CMake para un proyecto que se supone que usa la biblioteca SDL2_image.No quiero obligar al usuario a instalar ninguna biblioteca en el sistema para poder construir el proyecto, así que aproveché la capacidad de CMake para descargar y crear dependencias (freetype, SDL2 y SDL2_image) desde el código fuente como proyectos externos.

Todo está bien con freetype y SDL2 (ambos incluyen CMakeLists.txt archivos listos para usar), pero se me acabaron las ideas sobre cómo hacerlo funcionar para SDL2_image.Los proyectos externos de CMake admiten configuraciones personalizadas y configuraciones de construcción que utilicé en diferentes variantes sin éxito.

El archivo CMake en sí se puede encontrar aquí, pero la parte problemática es esta:

# 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 ""
)

Un error ocurre mientras se construye sdl2_image_project.Algunas investigaciones triviales descubrieron que el error se genera por las referencias indefinidas a partes de libdl.Aquí hay una pequeña parte del error del agujero:

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'

Creo que el problema se debe al hecho de que el vinculador intenta crear una versión compartida de la biblioteca SDL2_image mientras la vincula a una biblioteca estática. libSDL2.a.La cuestión es que, si esto es correcto, el paso de construcción de SDL2 crea versiones estáticas y compartidas de sí mismo, por lo que se podría suponer que el vinculador usaría libSDL2-2.0.so en su lugar (en realidad no necesito una biblioteca compartida, solo la estática, pero no sé cómo evitar que el sistema de compilación intente crearla además de pasar --enable-shared=no al script de configuración SDL2_image, que no ayuda en este caso).

Después de mucho buscar en Google, descubrí que la posible fuente del problema es que sdl2-config (que se llama para obtener algunos indicadores para el compilador durante la creación de SDL_image) puede llamarse con argumentos incorrectos y produce cflags incorrectos que confunden todo lo demás.Pero no estoy seguro de que sea así y tampoco sé cómo influir. sdl2_config llamada desde CMake (configure --help no parece revelar ninguna opción útil para esta situación).

Estoy ejecutando Ubuntu 14.04 x64 si es importante.¡Agradecería cualquier consejo!

¿Fue útil?

Solución

Parece que necesitas vincular algunas bibliotecas como m y dl.Se puede arreglar proporcionando costumbre sdl2-config archivo.Copiar sdl2-config del archivo extraído y sustituto --libs resultado:

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

Tenga en cuenta que el orden es importante (por eso simplemente modificar LIBS no me funciona).Ahora este archivo se puede utilizar en su ExternalProject_Add comando en lugar de SDL2_CONFIG=${SDL2_BIN}/sdl2-config:

...
... CFLAGS=-I${SDL2_SRC}/include SDL2_CONFIG=${CMAKE_CURRENT_LIST_DIR}/sdl2-config <SOURCE_DIR>/configure
...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top