【cmake】CMakeList添加库 | 您所在的位置:网站首页 › Cmake生成一个lib一个exe › 【cmake】CMakeList添加库 |
目录 官网查阅 开胃菜例子 CMakeLists生成和添加依赖库 CMakeLists更多小例子 生成.so共享库文件 调用.so共享库文件 生成一个可执行程序的 CMakeList 生成一个.so动态库的 CMakeList add_library(生成库),target_link_libraries(生成目标连接的库),set_target_properties 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单行注释和多行注释 target_link_libraries 中的PRIVATE, PUBLIC, INTERFACE 区别 作者: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.cxx2、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); #endif3 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 实验室设备网 版权所有 |