Вопрос или проблема
После сборки кода при запуске исполняемого файла я получаю ошибку
./test_pq: ошибка при загрузке разделяемых библиотек: libpqxx-6.2.so: невозможно открыть файл общего объекта: Нет такого файла или каталога
Пример моего файла CMake:
cmake_minimum_required(VERSION 3.24)
set(CMAKE_CXX_STANDARD 17)
find_library(pqxx libpqxx.so PATHS "/opt/bb/lib64")
find_library(pq libpq.so PATHS "/opt/bb/lib64")
if(EXISTS ${pqxx})
message(STATUS "найден путь ${pqxx}")
endif()
add_executable(test_pq test_pq.cpp)
target_include_directories(test_pq
PUBLIC
"/opt/bb/include/pqxx6"
)
target_compile_options(test_pq
PUBLIC
-std=c++17
-pthread
)
target_link_options(test_pq
PUBLIC
-L/opt/bb/lib64
)
target_link_libraries(test_pq
PUBLIC
pqxx
pq
)
C++ код:
#include <string>
#include <iostream>
#include <pqxx/pqxx>
int main(int argc, char ** argv)
{
try
{
pqxx::connection connectionObject("host=test port=10991 dbname=test user=test password=test");
pqxx::work worker(connectionObject);
if (connectionObject.is_open()) {
std::cout << "Успешно открыта база данных: " << connectionObject.dbname() << "\n";
try {
pqxx::result response = worker.exec("select * from employee");
std::cout << response.size() << "\n";
for (int i = 0; i < response.size(); i++) {
std::cout << "ID: " << response[i][0].c_str() << " Имя: " << response[i][2].c_str() << "\n";
}
}
catch (const std::exception& e) {
std::cout << e.what() << "\n";
}
}
else {
std::cout << "Не удается открыть базу данных" << "\n";
return 1;
}
// C.disconnect();
}
catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
return 1;
}
return 0;
}
Я просто выполняю cmake ..
и make VERBOSE=1
. Сборка и линковка проходят успешно и все выглядит хорошо:
/opt/rh/devtoolset-12/root/usr/bin/c++ -L/opt/bb/lib64 CMakeFiles/ball_init.dir/ball_init.cpp.o -o ball_init -lpqxx -lpq
Не уверен, что я упускаю здесь.
Ответ или решение
Ошибка, с которой вы столкнулись, связанная с загрузкой динамической библиотеки libpqxx-6.2.so
, указывает на то, что операционная система не может найти указанную библиотеку. Это может произойти по нескольким причинам, которые мы рассмотрим подробно.
Понимание проблемы
Когда вы запускаете ваше приложение, система пытается загрузить необходимые динамические библиотеки, которые были указаны при компиляции. В вашем случае это библиотека libpqxx-6.2.so
, относящаяся к библиотеке C++ для работы с PostgreSQL. Сообщение об ошибке говорит о том, что эта библиотека не может быть открыта, поскольку она не найдена в стандартных путях поиска библиотеки, установленных в системе.
Общие причины и решения
1. Убедитесь, что библиотека установлена
Первый шаг — проверьте, действительно ли библиотека libpqxx-6.2.so
существует в вашей системе. Вы можете использовать команду find
или locate
:
find /opt/bb/lib64 -name "libpqxx-6.2.so"
Если библиотека существует, переходите к следующему шагу.
2. Проверка путей поиска библиотек
Если библиотека установлена, необходимо убедиться, что система знает, где ее искать. Для этого укажите путь к библиотекам в переменной LD_LIBRARY_PATH
. Вы можете сделать это временно в текущей сессии терминала:
export LD_LIBRARY_PATH=/opt/bb/lib64:$LD_LIBRARY_PATH
Либо добавьте в ваш файл конфигурации оболочки, например, ~/.bashrc
, чтобы это действие выполнялось автоматически при каждом входе в систему.
3. Использование ldconfig
Если вы хотите сделать библиотеку доступной для всех пользователей системы, можно добавить путь в файл конфигурации ld.so.conf
. Создайте новый файл конфигурации:
echo "/opt/bb/lib64" | sudo tee /etc/ld.so.conf.d/my_libs.conf
Затем обновите кэш библиотек:
sudo ldconfig
4. Проверка правильности CMake конфигурации
В вашем CMakeLists.txt вы используете find_library
, чтобы найти библиотеку. Убедитесь, что путь указан правильно и libpqxx.so
действительно соответствует libpqxx-6.2.so
. Вы можете использовать ключ REQUIRED
в find_library
, чтобы настроить вывод ошибок, если библиотека не найдена:
find_library(pqxx REQUIRED libpqxx.so PATHS "/opt/bb/lib64")
5. Проверьте зависимости библиотеки
Возможно, ваша библиотека libpqxx-6.2.so
также зависит от других библиотек, которые не установлены в системе. Для проверки зависимостей можно использовать команду ldd
:
ldd /path/to/your/executable/test_pq
Эта команда покажет, какие библиотеки требуются для вашего исполняемого файла, а также укажет, найдены ли они.
Заключение
Следуя вышеуказанным шагам, вы сможете устранить ошибку, связанную с загрузкой библиотеки libpqxx-6.2.so
. Не забывайте всегда проверять, правильно ли указаны пути к библиотекам в CMake и правильно ли настроены переменные окружения. Если проблема сохраняется, возможно, стоит обратиться за поддержкой в сообщество разработчиков PostgreSQL или к документации по библиотеке libpqxx
.