Не удалось определить абсолютный путь статических библиотек с помощью переменной CMake PROJECT_SOURCE_DIR - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь создать проект Android NDK с использованием CMake. Мой проект имеет зависимости некоторых предварительно собранных статических библиотек, таких как libcurl . Я изо всех сил пытался связать эти библиотеки со своей собственной нативной библиотекой, затем я последовал этому ответу . В нем говорится, что необходимо указать абсолютные пути для статических библиотек, и вот здесь я столкнулся с проблемой.

Я нашел переменную CMake с именем PROJECT_SOURCE_DIR, которая, как я полагаю, является корневой директорией моего проекта согласно документации. Но когда я попытался использовать эту переменную в моем файле CMakeList.txt , выдается следующая ошибка:

Build command failed.
Error while executing process /Users/sdsl/Library/Android/sdk/cmake/3.6.4111459/bin/cmake with arguments {--build /Users/sdsl/Documents/AfriGIS-SB/GitLab/AGMapKit3dDroid/agmapkit3d_droid/mapkit3dapp/.externalNativeBuild/cmake/debug/x86_64 --target mapkit-engine}
ninja: error: '../../../../mapkit3dapp/src/main/jni/CoreClasses/Libraries/droid/libcurl/x86_64/libcurl.a', needed by '../../../../build/intermediates/cmake/debug/obj/x86_64/libmapkit-engine.so', missing and no known rule to make it

Вот мой CMakeLists.txt файл:

cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
             mapkit-engine

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/jni/MKMapJNI.cpp
             src/main/jni/CoreClasses/IMKCPlatform.cpp)

# Specifies a path to native header files.
include_directories(src/main/jni/CoreClasses/)
include_directories(src/main/jni/CoreClasses/Libraries/droid/libcurl/include/)

find_library(log-lib log)
find_library(android-lib android)
target_link_libraries(mapkit-engine ${log-lib} ${android-lib})

target_link_libraries(mapkit-engine ${PROJECT_SOURCE_DIR}/mapkit3dapp/src/main/jni/CoreClasses/Libraries/droid/libcurl/${ANDROID_ABI}/libcurl.a)

Я могу заверить, что мои статические библиотеки правильно хранятся в каталоге моего проекта. И если я попытался перейти к корневому каталогу моего проекта, щелкнув эту переменную PROJECT_SOURCE_DIR, он перенесет меня в корневой каталог в IDE.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я понял, что мое понимание неверно для переменной cmake PROJECT_SOURCE_DIR, официальная документация также не совсем ясна относительно ее фактического результата.

Каталог верхнего уровня для текущего проекта.

Это исходный каталог самой последней команды project ().

Но в большинстве проектов Android NDK, использующих сборку cmake, вполне нормально не вызывать команду project() вручную. И в этом случае переменная PROJECT_SOURCE_DIR указывает на каталог src, где находится CMakeLists.txt .

В моем случае мой корневой каталог src был: /Users/sdsl/Documents/AfriGIS-SB/GitLab/AGMapKit3dDroid/agmapkit3d_droid/. И PROJECT_SOURCE_DIR указывает на: /Users/sdsl/Documents/AfriGIS-SB/GitLab/AGMapKit3dDroid/agmapkit3d_droid/mapkit3dapp/.

Это также каталог, куда я положил файл CMakeLists.txt . Спасибо Цывареву за помощь в выяснении того, что на самом деле PROJECT_SOURCE_DIR приводит к исполнению.

0 голосов
/ 14 января 2019

Похоже, ты один на один. Попробуйте

${PROJECT_SOURCE_DIR}/src/main/jni/CoreClasses/Libraries/droid/libcurl/${ANDROID_ABI}/libcurl.a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...