Cmake学习
来源:互联网 发布:凌波多媒体教学软件 编辑:程序博客网 时间:2024/04/27 22:51
cmake 学习笔记
Cmake的介绍和使用 Cmake实践
Cmake优点:
1. 开发源代码,实用类BSD许可发布。
2. 跨平台,并可以生成native编译配置文件,在linux/unix平台,生成makefile,在mac平台可以生成xcode,在windows平台可以生成msvc工程的配置文件。
3. 能够管理大型项目
4. 简化编译构建过程和编译过程,只需要cmake+make就可以
5. 高效率
6. 可扩展,可以为cmake编写特定功能的模块,扩充cmake功能
如何安装cmake
1. Cmake的安装可以使用autotools进行安装,点击cmake-2.8.6.tar.gz 链接,可以对软件进行下载。
2. ./configure
3. make
4. sudo make install
Cmake的原理
Helloworld cmake
//main.cpp
#include<cstdio>
int main()
{
printf("hello world from main\n");
return 0;
}
创建CMakeLists.txt(注意大小写一个字母都不能错)
向该文件中加入以下几行(稍后会做解释)
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
运行以下命令:
cmake . (别忘记加上这个点,表示当前目录)
注意执行完这句话之后会生成几个文件如下:
CMakeFiles, CMakeCache.txt, cmake_install.cmake等文件,并且生成了Makefile
然后执行make 就可以生成可执行文件hello
这是当前目录下就会生成可执行文件如下图:
对例子的解释:
CMakeLists.txt的内容如下:
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
Project的指令的语法是:
PROJECT(projectname [CXX] [C] [JAVA])
这个执行是用来定义工程的名称的和定义工程支持的语言。这个指令也隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_BINARY_DIR,这里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,两个变量指的都是当前工程的路径。
SET指令的语法:
SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])
Set指令是用来显式的定义变量的,我们之前用到的是SET(SRC_LIST main.cpp)如果有多个源文件,也可以定义成SET(SRC_LIST main.cpp t1.cpp t2.cpp)。
MESSAGE指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
这个指令用于向终端输出用户信息,包含三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为-的信息。
FATAL_ERROR,立即终止所有cmake过程。
我们在这里使用的是STATUS信息输出,显示了由PROJECT指令顶一顶两个饮食变量HELLO_BINARY_DIR和HELLO_SOURCE_DIR。
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表,本例中你可以直接写成ADD_EXECUTABLE(hello main.c)。
将本例改写成一个最简化的CMakeLists.txt:
PROJECT(HELLO)
ADD_EXECUTABLE(hello main.c)
下面我们介绍一个比较实用的例子,即包含生成静态库又包含引入外部头文件和链接库的cmake demo。
先按照工程规范建立工程目录,并编写代码,以下面的工程目录为例进行解释这个例子,工程的目录结构为:
编译工程要实现的目标:
1. 添加子目录doc,用以放置这个工程的文档hello.txt
2. 生成hello的静态库,并在main可执行程序链接hello静态库
3. 在这个工程中添加COPYRIGHT,README
4. 在工程目录中添加一个run.sh的脚本,用以调用生成的二进制可执行文件
5. 将生成的二进制文件生成到bin子目录中
6. 编写安装程序
1. 编写CMakeLists.txt
由于一个工程目录中包含多个项目,其中在此项目中包含util项目和main项目,其中util项目是用以生成main程序需要的静态库,main是用以生成可执行文件。
在工程项目中的父目录向有一个CMakeLists.txt是用以声明定义工程需要的Cmake设置还定义了子目录src,用以递归的调用src中的MakeLists.txt。其中工程目录的CMakeLists.txt内容定义如下:
PROJECT(HELLO)
ADD_SUBDIRECTORY(src)
在src里面的CMakeLists.txt是用以定义src目录包含的两个工程的依赖关系分别进行编译。
util目录里面的CMakeLists.txt是用以定义生成util静态库的规则,其中内容如下:
SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)
SET(CMAKE_C_COMPILER g++)
SET(SRC_LIST hello.c)
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
ADD_LIBRARY(util STATIC ${SRC_LIST})
其中SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)定义了库生成的路径,LIBRARY_OUTPUT_PATH是一个内部变量,存放库生成路径。
SET(SRC_LIST hello.c)是用来定义库文件需要的源文件。
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)是用来定义非标准库头文件要搜索的路径。其中INCLUDE_DIRECTORIES命令的格式为:
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
ADD_LIBRARY(util STATIC ${SRC_LIST})是用来定义生成的库的名字,以及生成库的类型和生成库需要的源文件,其中ADD_LIBRARY命令格式为:
ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
SET(CMAKE_C_COMPILER g++)是用来定义c的编译器为g++,防止出现C和C++代码在不指定C编译器的情况下默认使用gcc,导致系统编译混乱。
在main目录中的CMakeLists.txt是用来定义可执行程序编译和链接时所需要的一些命令或环境。内容如下:
SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)
SET(SRC_LIST main.cpp)
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)
ADD_EXECUTABLE(hello ${SRC_LIST})
TARGET_LINK_LIBRARIES(hello util)
INCLUDE_DIRECTORIES命令是定义工程的include文件夹,其中存放使用到的库的头文件,LINK_DIRECTORIES是定义工程的库文件,其中存放着库文件,ADD_EXECUTABLE是定义生成的可执行文件,TARGET_LINK_LIBRARIES用以定义链接时需要的库文件。
2.在工程目录下创建build目录,并采用out-of-source方式编译项目。执行命令make ..,执行结果如下:
执行make,这时在build目录下生成了中间编译文件:
执行make命令,结果如下:
可以看到工程创建和编译成功了。
2. 安装
在工程目录下添加COPYRIGHT、README、和run.sh,重新编辑工程目录下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)
INSTALL(PROGRAMS run.sh DESTINATION bin)
INSTALL(PROGRAMS bin/hello DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)
这些命令表示在执行make install命令时,安装程序会拷贝相应的文件、目录或程序到指定的前缀开始的目录中,cmake执行命令如下:
cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..这时将工程目录安装到~/data/cmake_demo目录下。执行结果如下:
其中cmake编译c、c++工程完毕。
Cmake优点:
1. 开发源代码,实用类BSD许可发布。
2. 跨平台,并可以生成native编译配置文件,在linux/unix平台,生成makefile,在mac平台可以生成xcode,在windows平台可以生成msvc工程的配置文件。
3. 能够管理大型项目
4. 简化编译构建过程和编译过程,只需要cmake+make就可以
5. 高效率
6. 可扩展,可以为cmake编写特定功能的模块,扩充cmake功能
如何安装cmake
1. Cmake的安装可以使用autotools进行安装,点击cmake-2.8.6.tar.gz 链接,可以对软件进行下载。
2. ./configure
3. make
4. sudo make install
Cmake的原理
Helloworld cmake
//main.cpp
#include<cstdio>
int main()
{
printf("hello world from main\n");
return 0;
}
创建CMakeLists.txt(注意大小写一个字母都不能错)
向该文件中加入以下几行(稍后会做解释)
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
运行以下命令:
cmake . (别忘记加上这个点,表示当前目录)
注意执行完这句话之后会生成几个文件如下:
CMakeFiles, CMakeCache.txt, cmake_install.cmake等文件,并且生成了Makefile
然后执行make 就可以生成可执行文件hello
这是当前目录下就会生成可执行文件如下图:
对例子的解释:
CMakeLists.txt的内容如下:
PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
Project的指令的语法是:
PROJECT(projectname [CXX] [C] [JAVA])
这个执行是用来定义工程的名称的和定义工程支持的语言。这个指令也隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_BINARY_DIR,这里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,两个变量指的都是当前工程的路径。
SET指令的语法:
SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])
Set指令是用来显式的定义变量的,我们之前用到的是SET(SRC_LIST main.cpp)如果有多个源文件,也可以定义成SET(SRC_LIST main.cpp t1.cpp t2.cpp)。
MESSAGE指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
这个指令用于向终端输出用户信息,包含三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为-的信息。
FATAL_ERROR,立即终止所有cmake过程。
我们在这里使用的是STATUS信息输出,显示了由PROJECT指令顶一顶两个饮食变量HELLO_BINARY_DIR和HELLO_SOURCE_DIR。
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表,本例中你可以直接写成ADD_EXECUTABLE(hello main.c)。
将本例改写成一个最简化的CMakeLists.txt:
PROJECT(HELLO)
ADD_EXECUTABLE(hello main.c)
下面我们介绍一个比较实用的例子,即包含生成静态库又包含引入外部头文件和链接库的cmake demo。
先按照工程规范建立工程目录,并编写代码,以下面的工程目录为例进行解释这个例子,工程的目录结构为:
编译工程要实现的目标:
1. 添加子目录doc,用以放置这个工程的文档hello.txt
2. 生成hello的静态库,并在main可执行程序链接hello静态库
3. 在这个工程中添加COPYRIGHT,README
4. 在工程目录中添加一个run.sh的脚本,用以调用生成的二进制可执行文件
5. 将生成的二进制文件生成到bin子目录中
6. 编写安装程序
1. 编写CMakeLists.txt
由于一个工程目录中包含多个项目,其中在此项目中包含util项目和main项目,其中util项目是用以生成main程序需要的静态库,main是用以生成可执行文件。
在工程项目中的父目录向有一个CMakeLists.txt是用以声明定义工程需要的Cmake设置还定义了子目录src,用以递归的调用src中的MakeLists.txt。其中工程目录的CMakeLists.txt内容定义如下:
PROJECT(HELLO)
ADD_SUBDIRECTORY(src)
在src里面的CMakeLists.txt是用以定义src目录包含的两个工程的依赖关系分别进行编译。
util目录里面的CMakeLists.txt是用以定义生成util静态库的规则,其中内容如下:
SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)
SET(CMAKE_C_COMPILER g++)
SET(SRC_LIST hello.c)
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
ADD_LIBRARY(util STATIC ${SRC_LIST})
其中SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)定义了库生成的路径,LIBRARY_OUTPUT_PATH是一个内部变量,存放库生成路径。
SET(SRC_LIST hello.c)是用来定义库文件需要的源文件。
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)是用来定义非标准库头文件要搜索的路径。其中INCLUDE_DIRECTORIES命令的格式为:
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
ADD_LIBRARY(util STATIC ${SRC_LIST})是用来定义生成的库的名字,以及生成库的类型和生成库需要的源文件,其中ADD_LIBRARY命令格式为:
ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
SET(CMAKE_C_COMPILER g++)是用来定义c的编译器为g++,防止出现C和C++代码在不指定C编译器的情况下默认使用gcc,导致系统编译混乱。
在main目录中的CMakeLists.txt是用来定义可执行程序编译和链接时所需要的一些命令或环境。内容如下:
SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)
SET(SRC_LIST main.cpp)
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)
ADD_EXECUTABLE(hello ${SRC_LIST})
TARGET_LINK_LIBRARIES(hello util)
INCLUDE_DIRECTORIES命令是定义工程的include文件夹,其中存放使用到的库的头文件,LINK_DIRECTORIES是定义工程的库文件,其中存放着库文件,ADD_EXECUTABLE是定义生成的可执行文件,TARGET_LINK_LIBRARIES用以定义链接时需要的库文件。
2.在工程目录下创建build目录,并采用out-of-source方式编译项目。执行命令make ..,执行结果如下:
执行make,这时在build目录下生成了中间编译文件:
执行make命令,结果如下:
可以看到工程创建和编译成功了。
2. 安装
在工程目录下添加COPYRIGHT、README、和run.sh,重新编辑工程目录下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)
INSTALL(PROGRAMS run.sh DESTINATION bin)
INSTALL(PROGRAMS bin/hello DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)
这些命令表示在执行make install命令时,安装程序会拷贝相应的文件、目录或程序到指定的前缀开始的目录中,cmake执行命令如下:
cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..这时将工程目录安装到~/data/cmake_demo目录下。执行结果如下:
其中cmake编译c、c++工程完毕。
- 最大的Qt4程序群(KDE4)采用cmake作为构建系统
- Qt4的python绑定(pyside)采用了cmake作为构建系统
- 开源的图像处理库 opencv 采用cmake 作为构建系统
- ...
看来不学习一下cmake是不行了,一点一点来吧,找个最简单的C程序,慢慢复杂化,试试看:
例子一
单个源文件 main.c
例子二
==>分解成多个 main.c hello.h hello.c
例子三
==>先生成一个静态库,链接该库
例子四
==>将源文件放置到不同的目录
例子五
==>控制生成的程序和库所在的目录
例子六
==>使用动态库而不是静态库
例子一
一个经典的C程序,如何用cmake来进行构建程序呢?
//main.c#include <stdio.h>int main(){ printf("Hello World!/n"); return 0;}
编写一个 CMakeList.txt 文件(可看做cmake的工程文件):
project(HELLO)set(SRC_LIST main.c)add_executable(hello ${SRC_LIST})
然后,建立一个任意目录(比如本目录下创建一个build子目录),在该build目录下调用cmake
- 注意:为了简单起见,我们从一开始就采用cmake的 out-of-source 方式来构建(即生成中间产物与源代码分离),并始终坚持这种方法,这也就是此处为什么单独创建一个目录,然后在该目录下执行 cmake 的原因
cmake .. -G"NMake Makefiles"nmake
或者
cmake .. -G"MinGW Makefiles"make
即可生成可执行程序 hello(.exe)
目录结构
+| +--- main.c+--- CMakeList.txt|/--+ build/ | +--- hello.exe
cmake 真的不太好用哈,使用cmake的过程,本身也就是一个编程的过程,只有多练才行。
我们先看看:前面提到的这些都是什么呢?
CMakeList.txt
第一行 project 不是强制性的,但最好始终都加上。这一行会引入两个变量
- HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR
同时,cmake自动定义了两个等价的变量
PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR
因为是out-of-source方式构建,所以我们要时刻区分这两个变量对应的目录
可以通过message来输出变量的值
message(${PROJECT_SOURCE_DIR})
set 命令用来设置变量
add_exectuable 告诉工程生成一个可执行文件。
add_library 则告诉生成一个库文件。
- 注意:CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的。
cmake命令
cmake 命令后跟一个路径(..),用来指出 CMakeList.txt 所在的位置。
由于系统中可能有多套构建环境,我们可以通过-G来制定生成哪种工程文件,通过 cmake -h 可得到详细信息。
要显示执行构建过程中详细的信息(比如为了得到更详细的出错信息),可以在CMakeList.txt内加入:
- SET( CMAKE_VERBOSE_MAKEFILE on )
或者执行make时
- $ make VERBOSE=1
或者
- $ export VERBOSE=1
- $ make
例子二
一个源文件的例子一似乎没什么意思,拆成3个文件再试试看:
- hello.h 头文件
#ifndef DBZHANG_HELLO_#define DBZHANG_HELLO_void hello(const char* name);#endif //DBZHANG_HELLO_
- hello.c
#include <stdio.h>#include "hello.h"void hello(const char * name){ printf ("Hello %s!/n", name);}
- main.c
#include "hello.h"int main(){ hello("World"); return 0;}
- 然后准备好CMakeList.txt 文件
project(HELLO)set(SRC_LIST main.c hello.c)add_executable(hello ${SRC_LIST})
执行cmake的过程同上,目录结构
+| +--- main.c+--- hello.h+--- hello.c+--- CMakeList.txt|/--+ build/ | +--- hello.exe
例子很简单,没什么可说的。
例子三
接前面的例子,我们将 hello.c 生成一个库,然后再使用会怎么样?
改写一下前面的CMakeList.txt文件试试:
project(HELLO)set(LIB_SRC hello.c)set(APP_SRC main.c)add_library(libhello ${LIB_SRC})add_executable(hello ${APP_SRC})target_link_libraries(hello libhello)
和前面相比,我们添加了一个新的目标 libhello,并将其链接进hello程序
然后想前面一样,运行cmake,得到
+| +--- main.c+--- hello.h+--- hello.c+--- CMakeList.txt|/--+ build/ | +--- hello.exe +--- libhello.lib
里面有一点不爽,对不?
- 因为我的可执行程序(add_executable)占据了 hello 这个名字,所以 add_library 就不能使用这个名字了
- 然后,我们去了个libhello 的名字,这将导致生成的库为 libhello.lib(或 liblibhello.a),很不爽
- 想生成 hello.lib(或libhello.a) 怎么办?
添加一行
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
就可以了
例子四
在前面,我们成功地使用了库,可是源代码放在同一个路径下,还是不太正规,怎么办呢?分开放呗
我们期待是这样一种结构
+|+--- CMakeList.txt+--+ src/| || +--- main.c| /--- CMakeList.txt|+--+ libhello/| || +--- hello.h| +--- hello.c| /--- CMakeList.txt|/--+ build/
哇,现在需要3个CMakeList.txt 文件了,每个源文件目录都需要一个,还好,每一个都不是太复杂
- 顶层的CMakeList.txt 文件
project(HELLO)add_subdirectory(src)add_subdirectory(libhello)
- src 中的 CMakeList.txt 文件
include_directories(${PROJECT_SOURCE_DIR}/libhello)set(APP_SRC main.c)add_executable(hello ${APP_SRC})target_link_libraries(hello libhello)
- libhello 中的 CMakeList.txt 文件
set(LIB_SRC hello.c)add_library(libhello ${LIB_SRC})set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
恩,和前面一样,建立一个build目录,在其内运行cmake,然后可以得到
- build/src/hello.exe
- build/libhello/hello.lib
回头看看,这次多了点什么,顶层的 CMakeList.txt 文件中使用 add_subdirectory 告诉cmake去子目录寻找新的CMakeList.txt 子文件
在 src 的 CMakeList.txt 文件中,新增加了include_directories,用来指明头文件所在的路径。
例子五
前面还是有一点不爽:如果想让可执行文件在 bin 目录,库文件在 lib 目录怎么办?
就像下面显示的一样:
+ build/ | +--+ bin/ | | | /--- hello.exe | /--+ lib/ | /--- hello.lib
- 一种办法:修改顶级的 CMakeList.txt 文件
project(HELLO)add_subdirectory(src bin)add_subdirectory(libhello lib)
不是build中的目录默认和源代码中结构一样么,我们可以指定其对应的目录在build中的名字。
这样一来:build/src 就成了 build/bin 了,可是除了 hello.exe,中间产物也进来了。还不是我们最想要的。
- 另一种方法:不修改顶级的文件,修改其他两个文件
src/CMakeList.txt 文件
include_directories(${PROJECT_SOURCE_DIR}/libhello)#link_directories(${PROJECT_BINARY_DIR}/lib)set(APP_SRC main.c)set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)add_executable(hello ${APP_SRC})target_link_libraries(hello libhello)
libhello/CMakeList.txt 文件
set(LIB_SRC hello.c)add_library(libhello ${LIB_SRC})set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
例子六
在例子三至五中,我们始终用的静态库,那么用动态库应该更酷一点吧。 试着写一下
如果不考虑windows下,这个例子应该是很简单的,只需要在上个例子的 libhello/CMakeList.txt 文件中的add_library命令中加入一个SHARED参数:
add_library(libhello SHARED ${LIB_SRC})
可是,我们既然用cmake了,还是兼顾不同的平台吧,于是,事情有点复杂:
- 修改 hello.h 文件
#ifndef DBZHANG_HELLO_#define DBZHANG_HELLO_#if defined _WIN32 #if LIBHELLO_BUILD #define LIBHELLO_API __declspec(dllexport) #else #define LIBHELLO_API __declspec(dllimport) #endif#else #define LIBHELLO_API#endifLIBHELLO_API void hello(const char* name);#endif //DBZHANG_HELLO_
- 修改 libhello/CMakeList.txt 文件
set(LIB_SRC hello.c)add_definitions("-DLIBHELLO_BUILD")add_library(libhello SHARED ${LIB_SRC})set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
恩,剩下来的工作就和原来一样了。
- cmake学习
- CMake 学习
- cmake 学习
- cmake学习
- Cmake学习
- Cmake 学习
- Cmake学习
- CMake 学习
- cmake 学习
- CMake学习
- CMake 学习
- cmake学习
- CMake学习
- cmake 学习
- cmake学习
- CMake 学习
- CMake学习
- CMake学习
- Sencha Touch入门文章
- 我们曾经追过的经典手机
- 转载 highchat的参数 及其说明
- matlab 双边滤波
- (java 基础知识) Java打印---javax.print
- Cmake学习
- C# 访问Oracle数据库示例
- 【Win7系统 沙滩啤酒桌面主题】
- MinGW-GCC 如何编译JNI程序
- 嵌套Repeater
- static class 静态类(Java)
- 记事本
- 海量数据面试题整理 (新) -- 转自 Hackbuteer1
- http协议链接