openwrt软件包(编译自己的应用程序)用CMakeLists.txt方式

第一次写博文,写的不好还请见谅!

这周主要学习在openwrt的固件编译中,自定义应用包怎么使用CMakeLists.txt。网上找了很多资源,结果没一个对的,都是缺胳膊少腿的。

关于CMakeLists.txt的写法,看这两个蛮好的。CMakeLists.txt 语法介绍与实例演练_阿飞__的博客-CSDN博客_cmakelist【个人收藏笔记】CMakeLists.txt 语法简明教程_罗伯特祥的博客-CSDN博客_cmakelists.txt 教程

但看了这些肯定没法在openwrt里用起来,我测试了好久。发现几个重要环节特别说明一下。希望大家能看懂。

 

首先说明我的应用程序的makefile的变化。其实makefile和CMakeLists.txt之间有很多互动的,一定要注意!

include $(TOPDIR)/rules.mk

PKG_NAME:=cmaketest2    #这个最好和CMakeLists.txt里的projectname一致。
PKG_VERSION:=1.0
PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk    #这是新加的,使用CMakeLists.txt必须要的

define Package/$(PKG_NAME)
    SECTION:=base
    CATEGORY:=my app demo
    TITLE:=$(PKG_NAME) -prints a $(PKG_NAME) message
    DEPENDS:=+libpthread +libubox +libstdcpp  #需要c++支持的加上这个
endef

define Package/$(PKG_NAME)/description
    If you can't figure out what this program does, you're probably
    brain-dead and need immediate medical attention.
endef

 #这一段尤其重要,原来别人案例里的CMakeLists.txt为什么要放在src里,其实问题就在这段里,这是控制控制在build_dir里创建文件夹和复制那些文件进去的,就是因为标准案例里一般就是把src文件夹里的所有都复制到$(PKG_BUILD_DIR)里了。其实你要搞一个带include ,lib多文件夹的工程那你就要在这动脑筋了,我认为自己做的应用最多也就十来个cpp,hpp。就放在src一包烧就行,方便实用。

define Build/Prepare 
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/     #这就不要改了,有强迫症的,就要在这动脑筋了。
endef


define Package/$(PKG_NAME)/install
    $(INSTALL_DIR) $(1)/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/bin/ #注意PKG_NAME要和projectname一致,要不然找不到复制对象的。
endef

$(eval $(call BuildPackage,$(PKG_NAME)))

后面是 CMakeLists.txt内容。

#设置变量projectname 的内容
SET(projectname cmaketest2) 

PROJECT(${projectname})        #项目名称

cmake_minimum_required(VERSION 3.0)  #要求的最低cmake版本号

#openwrt 编译必要的选项.
include(GNUInstallDirs)

#=========================================================================
 
#添加所有头文件,我把能想到的都加了一下
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/include
	${CMAKE_CURRENT_SOURCE_DIR}/src
)

#发现所有的源文件,直接指向根目录,因为openwrt的makefile里是把cmakelists.txt和.c .cpp .h 都一包烧复制到一个文件夹了。
file(GLOB td_src
	${CMAKE_CURRENT_SOURCE_DIR}/*
)
 
#生成可执行文件 
add_executable(${projectname} ${td_src}) 
 

#=========================================================================
#添加链接库 还在测试。
# 对add_library或add_executable生成的文件进行链接操作
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
#target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)
#指定链接多个库
#target_link_libraries(${projectname}
#    ${CMAKE_CURRENT_SOURCE_DIR}/libface.a
#    boost_system.a
#    boost_thread
#   pthread)


#最后的install,openwrt编译必要的.
install(TARGETS ${projectname} RUNTIME DESTINATION bin) 

后面是我写的测试程序,故意的混乱写法,一是测试程序,偷懒。二是就要看看他能不能C  C++混合,自己识别。

#main.cpp

#include <iostream>

#include "fun1.h"

using namespace std;  

int main(int argc, char **argv)
{   
     
     cout << "This is C++ form cmake Demo" << endl;
     fun1();
     return 0;
}
#fun1.cpp

#include "fun1.h"
#include <iostream>

using namespace std; 

int fun1(void)
{   
     cout << "This is FUN1 cmake Demo" << endl;
     return 0;
}

 

#fun1.h

int fun1(void);

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值