【问题标题】:CMake: Linking a static library (.a) to small c++ scriptCMake:将静态库 (.a) 链接到小型 c++ 脚本
【发布时间】:2020-01-07 22:49:02
【问题描述】:

我正在尝试将预构建的静态库 leveldb 链接到一个小型 c++ 脚本,但是在尝试从 lib 中包含 .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;
}

根据其他堆栈溢出帖子,静态链接是使用 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

【问题讨论】:

  • 那么db.h文件在哪里?
  • 它应该是静态库的一部分吧?,看看github上的第一个代码sn-p link
  • 没有。从字面上看,这就是整个回购。为什么不只包含 cmake 配置?
  • 我不知道该怎么做,你知道任何关于这个的stackoverflow帖子吗?
  • 我相信只克隆 repo,add_subdirectory cmake 配置,然后只克隆 target_link_libraries(runscript PUBLIC leveldb).a 文件只是目标文件,它们不包含标题。 没有的原因在于,与静态库的链接应该在其中添加包含和生成文件的搜索路径的路径。静态库只是目标文件的存档。头文件需要单独发货。

标签: cmake


【解决方案1】:

链接另一个cmake项目,通常的方法是:

  • 在某处克隆存储库。例如,如果您的项目打算受 git 控制,大多数人会将 third_party 存储库添加为 git 子模块。注意:这也是ExternalProject_Add
  • 然后添加add_subdirectory(the_dir_with_the_repo)。这将获取 third_party CMakeLists.txt 文件并包含所有目标。
  • 之后,您可以像您自己的一样使用来自第三方 CMakeLists.txt 的目标 target_link_libraries(runscript PUBLIC leveldb)

一个静态库,一个扩展名为.a 的文件,只是一个目标文件的存档,仅此而已。目标文件不包含来自头文件、函数声明、外部变量声明、宏等的信息。在 C 语言中,头文件是作为完全独立的文件单独发布的。

【讨论】:

    【解决方案2】:

    解决方案。 (感谢上面 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]
    

    【讨论】:

    • add_subdirectory(third_party/leveldb)
    猜你喜欢
    • 2017-03-14
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多