CMake:add_subdirectory(...)隐含的用法

  在CMake中有add_executable(main main.c) ,给可执行程序链库时,要使用 target_link_libraries(...) 给main链库,但该command不能使用相对路径,若最顶层的project与subproject在同一个文件夹中,需要使用link_directories(...)来显式指明要链接的库所在的路径,可以使用相对路径。若想不用该command,可以采取在project与subproject上一级写CMakeLists.txt,并使用add_subdirectory方法,详细的例子如下所示:

(1)文件的目录结构:其中 sub_haha  sub_hello  top 均为 s1 文件夹下的子文件夹。

1 s1
2 ----sub_haha
3 ----sub_hello
4 ----top

  其中top文件夹下的文件如下:

  

  sub_haha文件夹下的文件如下:

  

  sub_hello文件夹下的文件如下:

  

  s1文件夹下的内容如下:

  

  s1文件夹下CMakeLists.txt的内容如下:

1 cmake_minimum_required(VERSION 2.8)
2 add_subdirectory(sub_haha sub_haha)
3 add_subdirectory(sub_hello sub_hello)
4 add_subdirectory(top top)

  top文件夹下CMakeLists.txt的内容如下:

1 cmake_minimum_required(VERSION 2.8)
2 include_directories(../sub_haha ../sub_hello)
3 add_executable(main main.c)
4 target_link_libraries(main haha_lib hello_lib)

  sub_haha文件夹下CMakeLists.txt的内容如下:

1 cmake_minimum_required(VERSION 2.8)
2 message("message from sub_haha")
3 add_library(haha_lib SHARED haha.c)

  sub_hello文件夹下CMakeLists.txt的内容如下:

1 cmake_minimum_required(VERSION 2.8)
2 message("message from sub_hello")
3 add_library(hello_lib SHARED hello.c)

  注意要在顶层s1文件夹下cmake:

 1 [[email protected]_33_35_centos s1]# cmake .
 2 -- The C compiler identification is GNU 4.4.7
 3 -- The CXX compiler identification is GNU 4.4.7
 4 -- Check for working C compiler: /usr/bin/cc
 5 -- Check for working C compiler: /usr/bin/cc -- works
 6 -- Detecting C compiler ABI info
 7 -- Detecting C compiler ABI info - done
 8 -- Check for working CXX compiler: /usr/bin/c++
 9 -- Check for working CXX compiler: /usr/bin/c++ -- works
10 -- Detecting CXX compiler ABI info
11 -- Detecting CXX compiler ABI info - done
12 message from sub_haha
13 message from sub_hello
14 -- Configuring done
15 -- Generating done
16 -- Build files have been written to: /root/cmake_test/same_level_lib/show/s1

  make:

 1 [[email protected]_33_35_centos s1]# make
 2 Scanning dependencies of target haha_lib
 3 [ 33%] Building C object sub_haha/CMakeFiles/haha_lib.dir/haha.c.o
 4 Linking C shared library libhaha_lib.so
 5 [ 33%] Built target haha_lib
 6 Scanning dependencies of target hello_lib
 7 [ 66%] Building C object sub_hello/CMakeFiles/hello_lib.dir/hello.c.o
 8 Linking C shared library libhello_lib.so
 9 [ 66%] Built target hello_lib
10 Scanning dependencies of target main
11 [100%] Building C object top/CMakeFiles/main.dir/main.c.o
12 Linking C executable main
13 [100%] Built target main  

  此时各个文件夹内容如下所示:

  可以看到两个库文件已经生成,可执行程序main也已经生成,使用ldd命令查看库的链接状况(注意ldd只能查看动态库,即后缀为.so的库文件):

  可以看到已经成功链接到两个动态库。

  执行main:

  可以看到输出成功。

时间: 2024-10-17 06:01:29

CMake:add_subdirectory(...)隐含的用法的相关文章

浅学CMake

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).CMake不构建出最终的可执行文件,而是产生一个标准的建构档(即根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件),然后再依一般的建构方式使用,从而实现软件的跨平台. <1>Linux下CMake的安装: 先到官网下载CMake源码包:https://cmake.org/download/ 打开终端依次执行以下命令: tar -xzvf cmake-2.6.4.tar.gz cd

CMakeLists实战解读--YouCompleteMe

原文转载自:Ricky.K http://www.cnblogs.com/rickyk/p/3877238.html 个人一直有一个想法,就是想出一系列关于CMakeLists.txt国外经典例子的实战解读.因为国内关于CMake的介绍和用法少之又少,再加上CMake本身对于实践能力的要求也比较高,过于理论化的学习只会让读者停留在Hello World和超级项目之间(其实就是理论知识要么简单很容易,单个cpp或者单个lib,或者例子复杂的要死,直接带动整个超大过程类似KDE这种),所以,我觉得我

CPU 寄存器

CPU 寄存器 寄存器是中央处理器内的组成部分,是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和地址.在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC). 寄存器是集成电路中非常重要的一种存储单元,通常由D触发器组成.在集成电路设计中,寄存器可分为电路内部使用的寄存器和充当内外部接口的寄存器这两类.内部寄存器不能被外部电路或软件访问,只是为内部电路的实现存储功能或满足电路的时序要求.而接口寄存器可以同时被内部电路和外部电路或软件访问,CPU中的寄存器就是其中一

API设计指南(译)

API的设计在软件系统中的重要性不言而喻,在swift.org上看到一篇“API Design Guidelines”,虽然是就Swift而言,但对于其它语言也有不少可以借鉴的地方,在这里粗略翻译一二,作交流用途,比较随性,有些删改,如果需要看原文,请移步 https://swift.org/documentation/api-design-guidelines/  . API设计指南 基本原则 清晰,是第一要务.API方法和属性一处声明,到处调用,我们需要设计的使用起来简单明了.当我们评估一个

隐含参数“_allow_resetlogs_corruption”的用法

当数据库中某些数据文件损坏,而从备份恢复这个文件所需的某个(或某些)联机日志文件或归档日志文件丢失时,只能把这些文件部分恢复,从而与数据库中其他文件不同步,我们可以通过下面的步骤还原并打开数据库: 用之前的备份恢复损坏的数据文件. 尽量还原损坏的文件. 把数据库启动到nomount. 用SQL命令重建控制文件(要求之前用“alter database backup controlfile to trace”做过控制文件的文本备份) 设置隐含参数:alter system set “_allow_

CMake 基本用法--写CMakeList.txt

http://techbase.kde.org/Development/Tutorials/CMake_(zh_CN) http://www.cmake.org/Wiki/CMake 这一章将从软件开发人员的角度来描写叙述怎样有用CMake.也就是说.假设你的目标是用CMake来管理你的生成过程,请阅读这一章. CMake的输入 COMMAND(args) 这里的 COMMAND 是命令行的名称.args是用空格切割的參数列表.典型的,对与每个项目的文件夹存在一个CMakeLists.txt.

JSP基本用法(二)隐含对象

一.摘要 在JSP容器中生成的Servlet类的_jspService()方法中,定义了几个对象,在编写JSP页面时我们可以使用这些隐含对象. PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _j

JSP基本用法(二)隐含对象

一.摘要 在JSP容器中生成的Servlet类的_jspService()方法中,定义了几个对象,在编写JSP页面时我们可以使用这些隐含对象. PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _j

cmake用法

1.使用cmake的时候,显示cmake不是内部或外部命令,也不是可执行的程序.解决办法参考: https://blog.csdn.net/zmdsjtu/article/details/52296522 2.cmake教程参考:https://www.hahack.com/codes/cmake/ 原文地址:https://www.cnblogs.com/yibeimingyue/p/10406402.html