Construyendo SDL2_image como un proyecto externo de CMake
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!
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
...