похоже, есть несколько вопросов, я постараюсь ответить на вопрос шаг за шагом:
Почему веб-сайт SDL рекомендует динамически устанавливать ссылки по возможности
Одной из причин динамического связывания приложения с библиотекой является разделение приложения с библиотекой (в данном случае это называется разделяемая библиотека / .so
). Вы можете обновить свою библиотеку без необходимости перекомпиляции кода приложения. Например, если вы завершили свой проект и на вашем клиенте запущено ваше приложение, я полагаю, вы вряд ли захотите перекомпилировать код приложения, как только обнаружится ошибка в используемой вами базовой библиотеке.
С другой стороны, связывая ваше приложение statically
, вы связываете свое приложение с этой библиотекой (.lib
или .a
форма). Значит, каждое изменение в библиотеке заставит вас перекомпилировать ваш код. Иногда это требуется, например, вы предоставляете вашему клиенту гарантию вашего приложения, обычно вы хотите быть уверены, что никакие будущие проблемы с вашей библиотекой не приведут к сбою вашего приложения.
У меня есть короткий пример кода, чтобы лучше это понять: CMakeLists.txt:
cmake_minimum_required (VERSION 3.0)
project(linkageLibrary)
set(STATIC_LIB lib_static)
set(SHARE_LIB lib_share)
set(STATIC_OTHER_LIB lib_otherstatic)
set(SHARE_OTHER_LIB lib_othershare)
add_library(${STATIC_LIB} STATIC ${STATIC_LIB}.cpp)
add_library(${SHARE_LIB} SHARED ${SHARE_LIB}.cpp)
# not yet in usage...
add_library(${STATIC_OTHER_LIB} STATIC ${STATIC_OTHER_LIB}.cpp)
add_library(${SHARE_OTHER_LIB} SHARED ${SHARE_OTHER_LIB}.cpp)
add_executable(${CMAKE_PROJECT_NAME} main.cpp)
target_include_directories(${CMAKE_PROJECT_NAME} PUBLIC ${${CMAKE_PROJECT_NAME}_SOURCE_DIR})
target_link_libraries(${CMAKE_PROJECT_NAME} ${STATIC_LIB} ${SHARE_LIB})
file(WRITE ${CMAKE_BINARY_DIR}/exchangeShareLibrary.sh "
echo \"before exchange the static library\"
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME} &&
mv ${CMAKE_BINARY_DIR}/lib${SHARE_LIB}.so ${CMAKE_BINARY_DIR}/lib${SHARE_LIB}.so.bk &&
cp ${CMAKE_BINARY_DIR}/lib${SHARE_OTHER_LIB}.so ${CMAKE_BINARY_DIR}/lib${SHARE_LIB}.so &&
echo \"after the shared library has been changed\" &&
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}")
file(WRITE ${CMAKE_BINARY_DIR}/exchangeStaticLibrary.sh "
echo \"before exchange the static library\"
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME} &&
mv ${CMAKE_BINARY_DIR}/lib${STATIC_LIB}.a ${CMAKE_BINARY_DIR}/lib${STATIC_LIB}a.bk &&
cp ${CMAKE_BINARY_DIR}/lib${STATIC_OTHER_LIB}.a ${CMAKE_BINARY_DIR}/lib${STATIC_LIB}.a &&
echo \"after the static library has been changed\" &&
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}")
main. cpp:
#include <iostream>
#include "lib.hpp"
using namespace std;
int main() {
printStaticLib();
printShareLib();
return 0;
}
lib.hpp:
#pragma ONCE
void printStaticLib();
void printShareLib();
lib_stati c. cpp:
#include <iostream>
#include "lib.hpp"
using namespace std;
void printStaticLib() {
cout << "linkage of lib_static" << endl;
}
lib_share. cpp:
#include <iostream>
#include "lib.hpp"
using namespace std;
void printShareLib() {
cout << "linkage of lib_share" << endl;
}
lib_otherstati c. cpp:
#include <iostream>
#include "lib.hpp"
using namespace std;
void printStaticLib() {
cout << "linkage of the other lib_static with other text" << endl;
}
lib_othershare. cpp:
#include <iostream>
#include "lib.hpp"
using namespace std;
void printShareLib() {
cout << "linkage of the other lib_share with other text" << endl;
}
если вы запустите сгенерированные сценарии, вы заметите, что printShareLib()
будет выводиться по-другому после обмена .so
get, но не printStaticLib()
. (Попробуйте еще раз make
без очистки, если вы сейчас выполните ./linkageLibrary
, на этот раз вы получите и другие выходные данные для printStaticLib()
. Вы можете догадаться, почему?)
с точностью до секунды проблема:
2 - динамическое связывание, по-видимому, автоматически находит зависимости intrinsi c (SDL2 и SDL2_image). Связывать статически нет. Почему это так?
, не зная настройки вашей системы, я полагаю, библиотека .a
stati c не может быть найдена вашей системой сборки. Попытайтесь найти, где это находится, и в конце концов верните find_library(SDL2_IMAGE_LIBRARY NAMES SDL2_image HINTS ${_YOUR_SDL2_INSTALLATION_PATH})
link
, теперь возвращаясь к вашему вопросу, почему SDL2 предложил динамически связывать, ну, это решение разработчика библиотеки, как вы могли прочитать в его README
Пожалуйста, обратитесь также к этому блогу о том, как использовать SDL2 с CMake