CMake: связывание библиотеки stati c (.a) с небольшим сценарием c ++ - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь связать предварительно собранную библиотеку stati c, leveldb, с небольшим сценарием c ++, однако при попытке включить файл .h из библиотеки я получаю сообщение об ошибке "файл не найден". Я не очень хорошо знаю CMake, поэтому любая помощь приветствуется.

//script.cc
#include <iostream>
#include "leveldb/db.h" // <<<<<<<< " fatal error: leveldb/db.h: No such file or directory"

int main(int argc, char** argv){
  std::cout << "hello \n";
  return 0;
}

Как и в случае с другими сообщениями о переполнении стека, stati c связывание выполняется с target_link_libraries (). Это мой текущий файл cmake
CMakeLists.txt

cmake_minimum_required(VERSION 3.13.4)
project(my_project)
link_directories(${CMAKE_SOURCE_DIR}/third_party/)
add_executable(runscript script.cc)
target_link_libraries(runscript ${CMAKE_SOURCE_DIR}/third_party/libleveldb.a)

По сути, это то, как выглядит мой каталог проекта

.
├── CMakeLists.txt
├── script.cc
└── third_party
    └── libleveldb.a

Ответы [ 2 ]

1 голос
/ 08 января 2020

Решение. (Благодаря комментарию KamilCuk выше)
CMakeLists.txt

cmake_minimum_required(VERSION 3.13.4)
project(my_proj)
add_subdirectory(third_party/leveldb)
add_executable(runscript script.cc)
target_link_libraries(runscript PUBLIC leveldb)
.
├── CMakeLists.txt
├── script.cc
└── third_party
    └── [leveldb repo]
1 голос
/ 08 января 2020

Для связи с другим cmake проектом обычно используется следующий способ:

  • Клонировать репо где-нибудь. Например, если предполагается, что ваш проект находится под контролем git, большинство людей добавляют третьи репозитории в виде субмодулей git. Примечание: это также ExternalProject_Add .
  • Затем добавьте add_subdirectory(the_dir_with_the_repo). Это создаст файл Third_party CMakeLists.txt и включит в себя все существующие цели.
  • После этого вы можете просто target_link_libraries(runscript PUBLIC leveldb) использовать цели из третьего_партии CMakeLists.txt как свои собственные.

Библиотека stati c, файл с расширением .a, является просто архивом объектных файлов, вот и все. Объектные файлы не содержат информацию из заголовочных файлов, объявлений функций, объявлений внешних переменных, макросов и т. Д. c. В C заголовки языка должны поставляться отдельно, как полностью независимые файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...