__2017-12-16 如一模式识别研究

如一模式识别研究

vc++>>cmake例程以及注释

通过6个例子,由浅入深了解cmake工作过程澶х瑧

建议结合cmake命令手册来加深理解濂嬫枟


例程1

经典C程序用cmake编译,代码如下:

//main.c

#include 

int main()

{

    printf("Hello World!/n");

    return 0;

}

编写一个CMakeLists.txt 文件,内容如下:

# 建立工程HELLO,自动生成两个变量: HELLO_BIN_DIR和HELLO_SOURCE_DIR,这两个变量的值可以通过 message 来输出,如message($(PROJECT_SOURCE_DIR)
project(HELLO)

# SET命令来设置需要编译的源文件
set(SRC_LIST main.c)

# 生成一个可执行文件
add_executable(hello ${SRC_LIST})

然后,在本目录下,创建子目录build,转到build 下,然后:

命令行下运行:
# 利用cmake 命令使用CMakeLists.txt 生成make用得MakeFile
cmake ..

或者

cmake .. -G"MinGW Makefiles"

成功后,再运行:

# 调用Makefile 来编译源码
nmake 

或者

make

即可生成可执行程序 hello( 二进制)

然后执行hello

./hello


例程2

将上述文件拆成3个文件

1 hello.h

2 hello.c

3 main.c

// hello.h
#ifndef DBZHANG_HELLO_
#define DBZHANG_HELLO_
void hello(const char* name);
#endif //DBZHANG_HELLO_


// hello.c
#include 
#include "hello.h"

void hello(const char * name)
{
    printf ("Hello %s!/n", name);
}


// main.c
#include "hello.h"
int main()
{
    hello("World");
    return 0;
}
然后准备好 CMakeLists.txt 文件:

project(HELLO)
set(SRC_LIST main.c hello.c)
add_executable(hello ${SRC_LIST})

然后就:建立build文件夹,分别使用cmake 和make命令实现编译。


例程3

将例2中的hello.c编译成库,然后用 main来调用库文件

project(HELLO)
set(LIB_SRC hello.c)
set(APP_SRC main.c)

#指定生成库文件libhello
add_library(libhello ${LIB_SRC})

#指定生成可执行文件hello
add_executable(hello ${APP_SRC})
#指定链接可执行文件时,要链接libhello
target_link_libraries(hello libhello)

#把库名libhello(liblibhello.a)改名为hello(libhello.a)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")



例程4

将APP的源码和库的源码分开放。

目录结构如下:

+
|
+--- CMakeList.txt
+--+ src/
|  |
|  +--- main.c
|  /--- CMakeList.txt
|
+--+ libhello/
|  |
|  +--- hello.h
|  +--- hello.c
|  /--- CMakeList.txt
|
/--+ build/
app源码放在 src中,库源码放在 hello中,那么这样,就需要3个CMakeLists.txt 文件了

最顶层的 CMakeLists.txt

project(HELLO)
#去子目录寻找新的CMakeList.txt 子文件
add_subdirectory(src)
add_subdirectory(libhello)

 src 中的CMakeLists.txt

#指明头文件所在的路径。
include_directories(${PROJECT_SOURCE_DIR}/libhello)
set(APP_SRC main.c)
add_executable(hello ${APP_SRC})
target_link_libraries(hello libhello)

libhello 中的CMakeLists.txt

set(LIB_SRC hello.c)
add_library(libhello ${LIB_SRC})
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
和前面一样,建立一个  build目录,然后在其内运行cmake make,就可以得到:

build/src/hello.exe
build/libhello/libhello.a


例程5

让例4中的可执行文件在bin目录,库文件在lib目录,目录结构如下:

   + build/
   |
   +--+ bin/
   |  |
   |  /--- hello.exe
   |
   /--+ lib/
      |
      /--- hello.lib

两种办法,办法1:

#修改顶级的 CMakeList.txt 文件
project(HELLO)

# 指定 bin目录
add_subdirectory(src bin)
add_subdirectory(libhello lib)

办法2:

#不修改顶级的文件,修改其他两个文件
#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")


例程6

使用动态库。

如果不考虑 windows 下:

#libhello 中的CMakeLists.txt
set(LIB_SRC hello.c)
#添加  SHARED  参数,指明生成动态库
add_library(libhello SHARED ${LIB_SRC})
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
考虑windows平台:

       首先修改hello.h文件

修改 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
#endif
LIBHELLO_API void hello(const char* name);
#endif //DBZHANG_HELLO_
      然后,修改libhello/CMakeLists.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")
修改后,按照原来方法编译即可。

评论留言区

:
  

作者: 游客 ; *
评论内容: *
带*号为必填项目

如一模式识别更新提示

matlab在图像处理方面的应用有更新

如一模式识别 友情链接

关于本站作者     chinaw3c     mozilla