`
shappy1978
  • 浏览: 704376 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用CMake编译跨平台静态库

 
阅读更多

http://www.th7.cn/Program/c/201409/272941.shtml

 

在开始介绍如何使用CMake编译跨平台的静态库之前,先讲讲我在没有使用CMake之前所趟过的坑。因为很多开源的程序,比如png,都是自带编译脚本的。我们可以使用下列脚本来进行编译:

 

 

 

 

. / configure    -- prefix = /xxx / xx -- enable - static =YES

make

make install

相信手动在类Unix系统上面编译过开源程序的同学对上面的命令肯定非常熟悉。但是,如果不配置编译器和一些编译、链接参数,这样的操作,最后编译出来的静态库只能在本系统上面被链接使用。比如你在mac上面运行上面的命令,编译出来的静态库就只能给mac程序链接使用。如果在Linux上面运行上述命令,则也只能给Linux上面的程序所链接使用。如果我们想要在Mac上面编译出ios和android的静态库,就必须要用到交叉编译。 

要进行交叉编译,一般来说要指定目标编译平台的编译器,通常是指定一个CC环境变量,根据编译的是c库还是c++库,要分别指定C_flags和CXX_flag,当然还需要指定c/c++和系统sdk的头文件包含路径。总之,非常之繁琐,大家可以看一下我之前把png编译到ios和mac上面的静态库所使用的 脚本 。 

为什么要使用CMake

为什么我们不使用autoconf?为什么我们不使用QMake,JAM,ANT呢?具体原因大家可以参考我在本文最后的参考链接里面的《Mastering CMake》一书的第一章。我自己使用CMake的感受就是:我原来编写bash,配置configure参数,读各个开源库的INSTALL文件(因为不同库的configure参数有差别),配置各种编译flag,头文件包含等。最后3天时间,折腾了png和jepg两个库的编译。当然,中间我还写了android和linux的编译脚本。而换用CMake以后,我2天时间编译完了Box2D,spine和Chipmunk的编译。并且配置脚本相当简单,添加新的库,基本上只是拷贝脚本,修改一两个参数即可。有了CMake,编译跨平台静态库和生成跨平台可执行程序So Easy!

编写CMakeLists.txt

编写一个静态库的CMake配置文件过程如下:(这里我以Box2D为例)

指定头文件和源文件

 

 

 

 

include_directories (

$ { CMAKE_CURRENT_SOURCE_DIR }

)

file ( GLOB_RECURSE box2d_source _ files "${CMAKE_CURRENT_SOURCE_DIR}/Box2D/*.cpp" )

我的CMakeLists.txt和Box2D的文件结构关系如下图所示:

box2d_cmake

这里的${CMAKE_CURRENT_SOURCE_DIR}表示CMakeLists.txt所在的目录。而GLOB_RECURSE可以递归地去搜索Box2D目录下面所有的.cpp文件来参与静态库的编译。而include_directories和file指令,显而易见,它们是用来指定静态库的头文件和实现文件。

指定库的名字

 

 

 

 

add_library ( Box2D STATIC $ { box2d_source_files } )

这里add_library表示最终编译为一个库,static表示是静态库,如果想编译动态库,可以修改为shared. 至此,一个静态库的配置就完成了。当然,因为这个库没有包括其它外部的头文件,所以会比较简单。但这也远比一个Makefile要简单N倍。 

编译linux静态库(含64位和32位)

编译linux的静态库是非常简单的,只需要安装好cmake以后,运行以下命令即可:

 

 

 

 

cmake .

make

注意,如果是64位的系统,那么这样只能生成64位的静态库。想要编译出32位的静态库,则必须要先安装32位系统的编译工具链。

 

 

 

 

sudo apt - get install libx32gcc - 4.8 - dev

sudo apt - get install libc6 - dev - i386

sudo apt - get install lib32stdc ++ 6

sudo apt - get install g ++ - multilib

然后,只需要指定cxx_flags为-m32即可,对应的CMake的写法为:

 

 

 

 

set ( CMAKE_CXX _ FLAGS "${CMAKE_CXX_FLAGS} -m32" )

最后用cmake生成makefile并make即可生成32位的静态库

编译ios静态库

编译ios库,最好先用cmake生成xcode工程。但是cmake默认的写法

 

 

 

 

cmake - GXcode .

只能生成mac平台的xcode工程,而不能生成ios平台的xcode工程。不过我们可以借助 ios-cmake 开源项目。 

下载iOS_32.cmake这个toolchain文件,然后使用下列命令来生成ios工程:

 

 

 

 

cmake - DCMAKE_TOOLCHAIN_FILE = . . / toolchain / iOS_32 . cmake    -DCMAKE_IOS_DEVELOPER_ROOT = / Applications / Xcode . app / Contents / Developer /Platforms / iPhoneOS . platform / Developer /    - GXcode . .

有了ios工程以后,我们就可以调用xcodebuild来生成静态库了:

 

 

 

 

xcodebuild - project Project . xcodeproj - alltargets - sdk iphonesimulator7 . 1- configuration Release

这条命令会生成一个胖包(armv7、armv7s)。但是默认只会生成32位的胖包。因此,我修改了iOS_32.cmake,让它可以生成64位的静态库。这个文件为 iOS_64.cmake . 

所有的ios静态库(i386,x86_64,armv7,armv7s,arm64)生成完以后,可以用lipo来生成一个胖包,命令如下:

 

 

 

 

lipo lib / i386 / libBox2D . a lib / x86_64 / libBox2D . a lib / armv7 / libBox2D. a lib / arm64 / libBox2D . a - create - output libBox2D . a

编译mac静态库

这个比较简单,直接Xcode -GXcode,然后用xcodebuild命令即可。

编译Andoird静态库

编译android库我们同样可以引入一个toolchain文件,这里我是从 android-cmake 里面下载的。 

在使用这个toolchain文件之前,我们先要使用ndk自带的make-standalone-toolchain.sh脚本来生成对应平台的toolchain.这个脚本位于你的NDK的路径下面的buil/tools目录下。

比如要生成arm平台的toolchain,我们可以使用下列命令:

 

 

 

 

sh $ ANDROID_NDK / build / tools / make - standalone - toolchain . sh -- platform= android - $ ANDROID_API_LEVEL -- install - dir = . / android - toolchain --system = darwin - x86_64 -- ndk - dir = / Users / guanghui / AndroidDev / android- ndk - r9d / -- toolchain = arm - linux - androideabi - 4.8

这里的$ANDROID_NDK为你的NDK的安装路径。这段命令可以生成arm的toolchain,最终可以编译出armeabi和armeabi-v7a静态库。 如果想生成x86的toolchain,指需要使用下列命令: 

 

 

 

 

sh $ ANDROID_NDK / build / tools / make - standalone - toolchain . sh -- platform= android - $ ANDROID_API_LEVEL -- install - dir = . / android - toolchain - x86-- system = darwin - x86_64 -- ndk - dir = / Users / guanghui / AndroidDev /android - ndk - r9d / -- toolchain = x86 - 4.8

最后,我们要告诉CMake使用外部toolchain文件,可以使用参数-DCMAKE_TOOLCHAIN_FILE=xxx。此外,我们还需要在导出两个环境变量给此toolchain文件:

 

 

 

 

export PATH = $ PATH : . / android - toolchain / bin

export ANDROID_STANDALONE_TOOLCHAIN = . / android - toolchain

cmake - DCMAKE_TOOLCHAIN_FILE = . . / android . toolchain . cmake - DANDROID_ABI= "armeabi" . .

编译Win32,wp8和winrt静态库

这里直接使用cmake-gui生成对应的VS工程,然后再手动编译即可。

关于Box2D完整的跨平台编译脚本可以参考 我的Github

分享到:
评论

相关推荐

    ios平台使用cmake交叉编译的工具链

    描述中提到的“编译静态库和动态库”意味着我们可以使用这个工具链来创建两种类型的库文件。静态库(.a)是将所有对象文件打包在一起的库,它们在编译时被链接到目标应用程序中,提供代码复用。动态库(.dylib)则是在...

    cmake编译静态库/动态库/可执行文件demo

    在这个"cmake编译静态库/动态库/可执行文件demo"中,我们将探讨如何使用CMake来编译不同的项目组件,包括静态库、动态库以及可执行文件。 首先,我们来看标题中的关键点——CMake。CMake的语法基于CMakeLists.txt...

    Cmake编译OsgEarth3.5的库

    在 IT 领域,CMake 是一个跨平台的构建系统,用于管理软件构建过程。它通过生成特定平台的构建工具(如 Makefile 或 Visual Studio 工程)来简化多平台开发。本篇文章将详细介绍如何使用 CMake 编译 OSGEarth 3.5,...

    opencv4.1.1已使用cmake编译.7z

    在本压缩包“opencv4.1.1已使用cmake编译.7z”中,提供了预编译的OpenCV 4.1.1版本,该版本已经使用CMake构建系统进行了配置和编译,适用于快速集成到你的项目中。 **1. OpenCV库介绍** OpenCV(开源计算机视觉库)...

    gdal.zip 经过cmake编译适用于vs2017

    在本案例中,"gdal.zip 经过cmake编译适用于vs2017" 表示已经有人预先使用CMake配置并编译了GDAL库,使其能够与Visual Studio 2017(VS2017)的C++环境无缝集成。 **GDAL知识点:** 1. **GDAL核心功能**:GDAL提供...

    vs2022+cmake工程 静态库+动态库演示

    CMake则是一个跨平台的构建系统,它允许开发者用一种统一的方式管理不同操作系统和编译器下的项目构建。本教程将重点介绍如何在VS2022中结合CMake创建静态库和动态库。 首先,我们需要了解静态库和动态库的区别。...

    Android Studio 基于cmake 链接静态库,动态库

    本篇文章将深入探讨如何在Android Studio中利用CMake链接静态库和动态库,以实现跨平台的原生代码编译。 首先,了解静态库和动态库的基本概念。静态库(如.a或.lib文件)在编译时会将库代码直接嵌入到可执行文件中...

    ios使用cmake编译framework

    总结一下,使用CMake编译iOS Framework的关键步骤包括: 1. 创建CMakeLists.txt,定义项目结构和编译选项。 2. 编写shell脚本以驱动CMake的配置和构建过程。 3. 使用工具链文件(toolchain.cmake)为iOS指定正确的...

    openssl-cmake-1.0.1e静态库和动态库都已经编译好,可以直接用

    本资源"openssl-cmake-1.0.1e静态库和动态库都已经编译好,可以直接用"是针对OpenSSL 1.0.1e版本的一个预编译库包,包含了CMake构建系统,便于集成到C++项目中。通常,使用预编译库可以节省开发者的时间,避免自行...

    CMAKE编译 VTk8.2.0库 VS2017 X64

    在IT行业中,构建和编译库是开发过程中的重要环节,特别是对于依赖于特定环境的项目,如跨平台的应用程序。本话题将深入探讨如何使用CMake工具在Visual Studio 2017环境下,为64位(X64)系统编译VTk8.2.0库。 VTk...

    OpenSceneGraph 通过cmake编译第三方库

    ### OpenSceneGraph 通过cmake编译第三方库 #### 知识点一:OpenSceneGraph简介 OpenSceneGraph(简称OSG)是一个跨平台的高性能3D图形渲染引擎,广泛应用于游戏开发、虚拟现实系统、科学可视化等领域。它提供了...

    cmake-cmake使用示例之生成静态库.zip

    在本示例中,我们将探讨如何使用CMake生成静态库。 首先,我们需要理解静态库的概念。静态库是将所有依赖的代码合并到一个可执行文件中,使得程序在运行时不需要依赖外部库。在C++中,我们通常使用`ar`工具或Visual...

    Ceph cmake编译管理.rar

    在Ceph项目中,CMake是一个关键的构建工具,用于管理和编译源代码,确保跨平台的兼容性和一致性。下面我们将详细探讨CMake在Ceph编译管理中的应用及其相关知识点。 首先,了解CMake的基本概念是必要的。CMake是一个...

    win下json编译好的静态库

    同时,确保安装了CMake,这是一个跨平台的自动化构建系统,用于管理项目构建过程。 3. **创建构建目录**:在JSONCPP源码目录外创建一个新的目录,如`build`,用于存放编译生成的文件。 4. **运行CMake**:打开...

    JRtpLib 源码 CMake 编译方法

    2. **编译工具**:可能包括CMake,一个跨平台的自动化构建系统,用于管理和构建项目。 3. **编译方法**:描述了如何使用CMake和Visual Studio 2010来编译源码,生成lib和dll文件。 4. **编译后的lib与dll**:编译...

    CMake编译OpenCV3.4.1+contrib3.4.1结果

    CMake是一个跨平台的开源构建系统,用于管理软件构建过程。它允许开发者通过编写CMakeLists.txt文件来描述构建步骤,然后生成特定平台的构建文件,如Windows上的Visual Studio解决方案。在我们的例子中,CMake将帮助...

    [cmake]添加依赖库的两种方式:从源码编译和使用已编译好的库 - 玄冬Wong - ITeye技术网站1

    - 对于跨平台项目,使用`find_package()`函数可以自动查找库,例如`find_package(archive REQUIRED)`,这简化了不同平台的配置。 - 如果库是动态链接的,需要考虑库的搜索路径(LD_LIBRARY_PATH环境变量)和运行时...

    cmakelists 生成静态库,然后用静态库生成动态库,然后生成测试程序

    CMake是一个跨平台的开源构建工具,可以生成各种编译器的项目配置文件,帮助我们处理编译、链接等步骤。本篇将深入探讨如何使用CMakeLists来生成静态库、动态库,并创建测试程序进行验证。 首先,我们要理解静态库...

    opencv3.4.3+vs2017+opencv_contrib3.4.3+cmake 编译后的文件

    4. `bin`目录:包含编译后的动态库(dll文件)和静态库(lib文件),这些是运行和编译依赖OpenCV的项目所必需的。 5. `include`目录:包含了OpenCV的头文件,开发者在编写代码时需要引用这些头文件来使用OpenCV的...

    GLOG源码 使用CMAKE之后生成了win32和win64的工程sln文件 在VS2019下编译成功,生成的库文件

    CMake是一个跨平台的构建系统,它不直接生成特定平台的构建工具指令,而是生成一个构建项目所需的配置文件,如Visual Studio的.sln或Unix Makefiles。在本例中,CMake用于生成适应win32和win64环境的工程文件。 3....

Global site tag (gtag.js) - Google Analytics