LINUX.ORG.RU

cmake dyld: Library not loaded

 , , ,


0

1

Всем привет, начал осваивать cmake. Есть вот такая структура:

➜  helloWorld ls                                                                                                                                                                                                           [18/11/29|11:19AM]
CMakeLists.txt    cmake-build-debug main.cpp          third_parties
➜  helloWorld

➜  helloWorld ls third_parties/say                                                                                                                                                                                         [18/11/29|11:19AM]
compilesaylib.sh libsaylib.dylib  saylib.cpp       saylib.h
➜  helloWorld

CMakeLists.txt выглядит вот так:

cmake_minimum_required(VERSION 3.12)
cmake_policy(SET CMP0015 NEW)
SET(CMAKE_SYSTEM_NAME Darwin)
project (myproject)

include_directories(${CMAKE_SOURCE_DIR}/third_parties/say)

file(GLOB LIBRARIES "third_parties/say/*.dylib")
message("LIBRARIES = ${LIBRARIES}")

add_executable(myproject main.cpp)
target_link_libraries(myproject ${LIBRARIES})

main.cpp:

#include <iostream>
#include "./third_parties/say/saylib.h"

int main() {
    say("Hi there!");
    return 0;
}

Ошибка:

➜  cmake-build-debug ./helloWorld                                                                                                                                                                                          [18/11/29|10:56AM]
dyld: Library not loaded: libsaylib.dylib
  Referenced from: /Users/oleg/CLionProjects/helloWorld/cmake-build-debug/./helloWorld
  Reason: image not found
[1]    17995 abort      ./helloWorld
➜  cmake-build-debug

Сама либа получается без пути и ищется в директории где исполняемый файл.

➜  cmake-build-debug otool -L helloWorld                                                                                                                                                                                   [18/11/29|10:56AM]
helloWorld:
	libsaylib.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.200.5)
➜  cmake-build-debug

Можно ли указать относительный путь к shared library чтобы не копировать либу к исполняемому файлу, а оставить ее там где она лежит сейчас? Заранее спасибо.



Последнее исправление: ECLIPSE (всего исправлений: 2)

Ответ на: комментарий от ECLIPSE

Но ведь относительные используешь?

Либо я не понял суть твоей боли, либо, ты недооцениваешь силу `CMAKE_CURRENT_SOURCE_DIR`.

pon4ik ★★★★★
()
Ответ на: комментарий от ECLIPSE

Задай все абсолютные пути к либе и директориям где её искать в одной точке, сохрани их в переменных в кэше. Используй при сборке эти переменные. Потом посмотри на это всё, почитай мануал как писать Find модули, и напиши уже Find модуль.

Хинт: без RPATH и прочих ухищрнений, за пределами хоста где происходила сборка всё равно придётся задавать LD_LIBRARY_PATH или конфигурировать ld.so другими способами.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

А CMAKE_CURRENT_SOURCE_DIR я конечно использую, просто он никак не видит либу даже если я укажу абсолютные пути в рамках моего кода.

ECLIPSE
() автор топика
Ответ на: комментарий от ECLIPSE

А, я чет не допёр, что речь про макось. Добавь тэгов по призыву маководов, я там ни разу даже не собирал ничего последние лет 10-15. Тогда вроде и cmake даже не было :)

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Нашел возможность устанавливать переменную окружения DYLD_LIBRARY_PATH, но неужели нет другого способа?

ECLIPSE
() автор топика
Ответ на: комментарий от ECLIPSE

Надо читать man по этому линкеру и загрузчику. Если он совместим с гнутыми, то по идее должен быть аналог RPATH. Но, это путь вникуда - для локалхоста или ультра проприетарных сборочек, в приличном обществе, за такое можно и в глаз получить.

По хорошему либы должны лежать в месте на путях либо должен конфигурироваться загрузчик. В gnu/linux это выполняется через переменные окружения или с помощью ldconfig например.

В любом случае, это вопрос не про cmake, а про инфраструктуру конкретной платформы.

pon4ik ★★★★★
()

target_link_libraries(helloWorld "-L../third_parties/say/" libsaylib.dylib)

"-L../third_parties/say/"

Что это?

link_directories(./third_parties/say/)

Опечатка?

Deleted
()
Ответ на: комментарий от Deleted

Да это я ошибся, я отредактировал пост. Спасибо.

ECLIPSE
() автор топика
Ответ на: комментарий от pon4ik

А настоящий мужик, написал бы Find модуль для своей 3rdparty или взял бы готовый...

++

Только ябписал cmake-config, а не полноценный Find модуль

Stil ★★★★★
()

Можно ли указать относительный путь к shared library чтобы не копировать либу к исполняемому файлу, а оставить ее там где она лежит сейчас?

LD_LIBRARY_PATH?

Stil ★★★★★
()
Ответ на: комментарий от annulen

Всем спасибо. Разобрался и сделал 2 способами: копировал ручками либы и ложил их исполняшке и rpath юзал.

ECLIPSE
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.