سؤال

لقد كنت أحاول إنشاء نظام بناء يستند إلى 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