【问题标题】:Creating and using a static library with CMake使用 CMake 创建和使用静态库
【发布时间】:2020-03-18 23:52:42
【问题描述】:

我正在尝试首先创建一个静态库,然后使用 CMake 将其链接到可执行文件。我的项目文件结构如下:

├── CMakeLists.txt
├── build
├── lib
│   ├── CMakeLists.txt
│   ├── build
│   ├── include
│   │   └── Point.hpp
│   └── src
│       └── Point.cpp
└── mainApp.cpp

我首先是这样构建库的。

cmake_minimum_required(VERSION 2.8.9)
project(CAST3)
set(CMAKE_BUILD_TYPE Release)

include_directories(include)

file(GLOB SOURCES "src/*.cpp")
add_library(CAST3 STATIC ${SOURCES})

但是,当我尝试将库链接到我的可执行文件时出现错误。

这是我的可执行文件

#include"Point.hpp"
int main(int argc, char *argv[]){
    Point p = Point(1,2,3);
    return 0;
}

这是我的 CMake 文件,用于将库链接到可执行文件。

cmake_minimum_required(VERSION 2.8.9)
project (CAST3)
set ( PROJECT_LINK_LIBS libCAST3.a )
link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/lib/build)
add_executable(libtest mainApp.cpp)
target_link_libraries(libtest ${PROJECT_LINK_LIBS} )

当我运行时,我得到了这个错误

/mainApp.cpp:1:9: fatal error: 'Point.hpp' file not found
#include"Point.hpp"
        ^~~~~~~~~~~
1 error generated.
make[2]: *** [CMakeFiles/libtest.dir/mainApp.cpp.o] Error 1
make[1]: *** [CMakeFiles/libtest.dir/all] Error 2
make: *** [all] Error 2

我错过了什么?

【问题讨论】:

  • cmake_minimum_required(VERSION 2.8.9) - 你确定你使用的是旧的 cmake 吗?这是从 2012 年开始的。

标签: c++ cmake linker


【解决方案1】:

我错过了什么?

您在lib/CMakeLists.txt 中缺少target_include_directories(CAST3 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

您缺少来自根 CMakeLists.txtadd_subdirectory(lib)

set ( PROJECT_LINK_LIBS libCAST3.a )target_link_libraries(libtest ${PROJECT_LINK_LIBS} )link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/lib/build) 可以被删除。那你就错过了target_link_libraries(libtest PUBLIC CAST3)。 Cmake 将自动找到正确的 .a 文件并使用 target_link_libraries 传播包含路径。

所以你的lib/CMakeLists.txt 可能看起来像这样:

cmake_minimum_required(VERSION 3.0) # I would advise to update
project(CAST3)
include_directories(include)
file(GLOB sources src/*.cpp) # upper case variable names reserved for exported variables by convention
add_library(CAST3 ${sources}) # STATIC by default
target_include_directories(CAST3 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

而 root CMakeLists.txt 可能看起来像这样:

cmake_minimum_required(VERSION 3.0) # I would advise to update
project(CAST3)
add_subdirectory(lib)
add_executable(libtest mainApp.cpp)
target_link_libraries(libtest CAST3)

【讨论】:

  • 太棒了!感谢您的快速回复。我是 CMake 新手,这对我很有帮助。
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
相关资源
最近更新 更多