Почему `make install` удаляет библиотечные файлы * .so, сгенерированные` make`? - PullRequest
0 голосов
/ 30 сентября 2018

Я собираю библиотеки C ++ Poco.Я делаю

cmake -DCMAKE_INSTALL_PREFIX=./ -DCMAKE_BUILD_TYPE=Debug ../
make
make install

При make install Я получаю ошибку

 "path/poco/instDir/lib/libPocoEncodingsd.so.60".
Call Stack (most recent call first):
  cmake_install.cmake:50 (include)


Makefile:85: recipe for target 'install' failed
make: *** [install] Error 

В основном файл libPocoEncodingsd.so.60 создается с make, но make install удаляет его.

Почему это так?

Если я не запускаю make install, папка внутри пути установки не создается и все файлы *.h не копируются туда.

1 Ответ

0 голосов
/ 02 октября 2018

Это происходит потому, что:

-DCMAKE_INSTALL_PREFIX=./

означает, что вы устанавливаете поверх самого каталога сборки, в результате чего для каждого имени файла в команде cmake:

  file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES
    "path/poco/instDir/lib/libPocoEncodingsd.so.60"
    "path/poco/instDir/lib/libPocoEncodingsd.so"
    )

исходный и целевой файлы совпадают.Cmake превентивно удаляет файл назначения, чтобы заменить его исходным файлом.Это означает, что он удалил файл source .Отсюда ваша ошибка.

Такое поведение может быть ошибкой в ​​cmake.На первый взгляд, если он проверяет и обнаруживает, что целевой файл существует и имеет ту же временную метку, что и исходный файл, он должен учитывать целевой файл в актуальном состоянии и не пытаться заменить его.Но я не углубился в это.Установка поверх вашей директории сборки разумно классифицируется как Не делайте этого .

Обычно в Unix-подобных ОС локально собранные пакеты должны быть установлены в /usr/local.Вот для чего /usr/local.Cmake, как и другие инструменты развертывания исходного пакета, по умолчанию соблюдает это соглашение.Поэтому, если вы просто запустите:

cmake -DCMAKE_BUILD_TYPE=Debug ../
make
sudo make install  # Or however you run `make install` as root.

, тогда библиотеки poco будут установлены в /usr/local/lib, а заголовки в /usr/local/include/Poco./usr/local/lib - это путь поиска библиотеки по умолчанию для компоновщика, а /usr/local/include - это путь поиска заголовка по умолчанию для компилятора.

Если по какой-то причине вы не хотите устанавливать префикс по умолчанию, выберитенекоторые:

-DCMAKE_INSTALL_PREFIX=/not/in/the/build/dir

и вы избежите этой проблемы.

...