Я использую CMake в проекте, и я пытаюсь статически связывать некоторые библиотеки. Я установил:
set(BUILD_SHARED_LIBS OFF)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
set_target_properties(icarus PROPERTIES LINK_SEARCH_END_STATIC 1)
И я убедился, что при поиске фактических библиотек у меня есть их версия .a.
В настоящее время проект импортирует:
libPocoNet.a
libPocoUtil.a
libPocoXML.a
libPocoFoundation.a
libmysqlclient.a
libmysqlpp.a
libcrypto++.a
CUDA
Все библиотеки найдены, и при выполнении динамической/общей связи они отлично работают. Я также попытался установить флаги компиляции:
set(GCC_CXX_FLAGS ${GCC_CXX_FLAGS} "-static-libgcc -static-libstdc++ -static")
Но безрезультатно. Хотя во время компиляции я не получаю никаких проблем, ссылка связывает много << → undefined ссылок для вызовов, найденных в указанных выше библиотеках, например:
undefined reference to `mysql_thread_init'
undefined reference to `mysql_real_query'
undefined reference to `pthread_mutex_unlock'
undefined reference to `Poco::ErrorHandler::handle()'
Не в этом конкретном порядке и многочисленные ошибки для каждой библиотеки.
Посмотрев на последнюю строку GCC, я вижу:
/usr/bin/c++ -g -g -static-libgcc -static-libstdc++ -static [list of *.cpp files]
-o icarus -rdynamic /usr/local/lib/libPocoFoundation.a /usr/local/lib/libPocoNet.a
/usr/local/lib/libPocoUtil.a /usr/local/lib/libPocoXML.a
-Wl,-Bstatic -lmysqlclient -lmysqlpp -lcrypto++
Это заставляет меня задаться вопросом:
- Почему библиотеки Poco связаны как -динамические, а флаг -Wl -Bstatic отсутствует? Как будто они пропускаются/исключаются из статической связи.
- mysqlclient, mysqlpp и crypto ++, похоже, установлены для статической привязки, но я все равно получаю ошибки.
Итак, может кто-нибудь, пожалуйста, объясните мне:
- Как настроить частичную статическую связь с помощью CMake
- Является ли CMAKE_EXE_LINKER_FLAGS единственным, который мне нужно установить?
- Должен ли я форсировать статические ссылки для упомянутых библиотек, но не для всего проекта?
Пожалуйста, извините меня, если у вас слишком много или слишком локализованных вопросов, я раньше этого не пробовал, и я не могу найти много информации в сети.