【cmake】CMakeList添加库 您所在的位置:网站首页 Cmake生成一个lib一个exe 【cmake】CMakeList添加库

【cmake】CMakeList添加库

2024-01-17 19:50| 来源: 网络整理| 查看: 265

目录

官网查阅

开胃菜例子

CMakeLists生成和添加依赖库

CMakeLists更多小例子

生成.so共享库文件

调用.so共享库文件

生成一个可执行程序的 CMakeList

生成一个.so动态库的 CMakeList 

CMAKE 添加编译选项|-g编译参数/选项

包含文件的的目录include_directories

优化项|优化等级

Cmake设置优化等级| cmake 生成 debug和 release 版

设置默认构建类型

CMake设置编译参数/选项

如何在cmakelists中加入-ldl编译选项

CMake指定gcc,g++版本编译

CMake 关闭警告的方法

关闭编译器优化

CMakeLists 实现动态宏开关

去掉编译优化

CMake--List用法

CmakeLists.txt单行注释和多行注释 

CMakeList 通配符

其他未归类

add_custom_target  自定义命令

add_dependencies 

Cmake条件判断指令|if 判断优先级

设置编译时和程序运行时去哪个目录找动态库

#指定运行时动态库的加载路径

#指定链接时动态库的路径

cmake install 和打包设定

CMakeLists.txt单行注释和多行注释

作者:bandaoyu,持续更新,链接:【cmake】CMakeList添加库|添加头文件|添加路径|add_executable、add_library、target_link_libraries|添加编译选项|宏开关_cmake添加头文件目录_bandaoyu的博客-CSDN博客

官网查阅

CMake 3.22.0-rc1文档:https://cmake.org/cmake/help/latest/search.html?q=add_library

cmake-commands(7) — CMake 3.23.5 Documentation

 CMake Cookbook:《CMake菜谱(CMake Cookbook中文版)》 :https://www.bookstack.cn/read/CMake-Cookbook/content-preface-preface-chinese.md

开胃菜例子 CMakeLists生成和添加依赖库

原文;cmake之生成动态库:https://www.cnblogs.com/pandamohist/p/13408455.html

1、目录结构

│ CMakeLists.txt │ index.txt │ ├─build ├─include │ hello.h │ hi.h │ └─src hello.cxx hi.cxx

2、CMakeLists.txt

cmake_minimum_required(VERSION 3.1) #项目名 project(libhello) # 1、指定库的目录变量 set(libhello_src src/hello.cxx) # 指定头文件搜索路径 include_directories("${PROJECT_SOURCE_DIR}/include") # 2、添加库(对应的两个项目) add_library( hello_shared SHARED ${libhello_src}) add_library( hello_static STATIC ${libhello_src}) # 按照一般的习惯,静态库名字跟动态库名字应该是一致的,只是扩展名不同; # 即:静态库名为 libhello.a; 动态库名为libhello.so ; # 所以,希望 "hello_static" 在输出时,不是"hello_static",而是以"hello"的名字显示,故设置如下 # SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello") # 3、cmake在构建一个新的target时,会尝试清理掉其他使用这个名字的库, # 因此,在构建libhello.a时,就会清理掉libhello.so. # 为了回避这个问题,比如再次使用SET_TARGET_PROPERTIES定义 CLEAN_DIRECT_OUTPUT属性。 SET_TARGET_PROPERTIES (hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1) SET_TARGET_PROPERTIES (hello_shared PROPERTIES CLEAN_DIRECT_OUTPUT 1) # 4、按照规则,动态库是应该包含一个版本号的, # VERSION指代动态库版本,SOVERSION指代API版本。 SET_TARGET_PROPERTIES (hello_static PROPERTIES VERSION 1.1 SOVERSION 1) SET_TARGET_PROPERTIES (hello_shared PROPERTIES VERSION 1.1 SOVERSION 1) # 5、若将libhello.a, libhello.so.x以及hello.h安装到系统目录,才能真正让其他人开发使用, # 本例中,将hello的共享库安装到/lib目录; # 将hello.h安装/include/hello目录。 #INSTALL (TARGETS hello hello_shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) #INSTALL (TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) #INSTALL (FILES hello.h DESTINATION include/hello)

3、configure and generate

xxx/to/path cd build cmake ..

4、其他设置

  若需要指定输出路径,尝试下面的示例指令:

# 设置VS会自动新建Debug和Release文件夹 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Bin) # 设置分别设置Debug和Release输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/../../build/Debug) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/Bin) CMakeLists更多小例子 生成.so共享库文件

下面是我的几个文件:

1hello.cpp

//hello.cpp  int Calculate_sum_Of_Two_Number(int x,int y) {    int z=0;    z=x+y;    return (z); }

2hello.hpp

//hello.hpp #ifndef     __HELLO_H #define     __HELLO_H int Calculate_sum_Of_Two_Number(int x,int y); #endif

3 main.cpp

//main.cpp #include "hello.hpp" #include int main(void) {    int a=0,b=0,c=0;    printf("please input two parameter:");    scanf("%d",&a);    scanf("%d",&b);    c=Calculate_sum_Of_Two_Number(a,b);    printf("the sum is : %d",c);    return 0; }

4 CMakeLists.txt

#要求的Cmake最低版本 CMAKE_MINIMUM_REQUIRED( VERSION 2.8)   #工程名称 PROJECT(main)   #设置编译器编译模式: set( CMAKE_BUILD_TYPE "Debug" )   #生成共享库 #get the shared package #here needs no .hpp add_library(calculate_shared SHARED  hello.cpp)   #生成可以执行的文件 add_executable(main main.cpp)   #连接共享库 target_link_libraries(main calculate_shared)

上面CmakeLists.txt里面, 共享库的名称是calculate_shared,这个是我们可以自己更改的。生成的可执行文件是main, 这个名称也是可以更改的。

不过需要注意的是,hello.cpp里面不用在包含hello.hpp 了。(汗,因为这个导致出错,提示说是重复定义函数了);

编译生成:

mkdir build cd    build cmake .. make 我们就可以看到build生成了 如下的文件:

CMakeCache.txt  cmake_install.cmake     main CMakeFiles      libcalculate_shared.so  Makefile

 libcalculate_shared.so就是生成的共享库文件。

他们的路径是:/home/fan/dev/cmake/4-exer/

下面有build文件夹,以及main.cpp, hello.cpp, hello.hpp, 

build文件夹下面有共享库 libcalculate_shared.so.so

调用共享库文件

所有的外部依赖库都是这样的,比如opencv ,openni, eigen等等,原理是一样的,只不过他们已经安装在系统里面了,可以查找,而这个则是需要我们自己去配置。

即我上面生成的共享库文件本质上和opencv的库是相同的。只不过这个共享库需要自己手动配置。

比如我又新建了一个工程,需要调用上面的共享库 libcalculate_shared.so。

main.cpp如下:

//main.cpp #include #include #include "hello.hpp" using namespace std; int main(void) {    int x=2,y=3;    int z=0;    z=Calculate_sum_Of_Two_Number(x,y);    cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有