cmake中关于设置LIBRARY_OUTPUT_PATH和EXECUTABLE_OUTPUT_PATH的总结
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
1、设置SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
以构建共享库为例,初始文件结构:
├── CMakeLists.txt
└── lib
├── CMakeLists.txt
├── hello.c
└── hello.h
主文件CMakeLists.txt文件内容
PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
在 lib 目录下建立两个源文件 hello.c 与 hello.h
hello.c 内容如下:
#include “hello.h”
void HelloFunc()
{
printf(“Hello World\n”);
}
hello.h 内容如下:
#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>
void HelloFunc();
#endif
在 lib 目录下建立 CMakeLists.txt,内容如下:
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
cmake编译后文件结构为:
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.5.1
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ ├── CompilerIdC
│ │ │ │ ├── a.out
│ │ │ │ └── CMakeCCompilerId.c
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ └── CMakeCXXCompilerId.cpp
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── feature_tests.bin
│ │ ├── feature_tests.c
│ │ ├── feature_tests.cxx
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ └── TargetDirectories.txt
│ ├── cmake_install.cmake
│ ├── lib
│ │ ├── CMakeFiles
│ │ │ ├── CMakeDirectoryInformation.cmake
│ │ │ ├── hello.dir
│ │ │ │ ├── build.make
│ │ │ │ ├── C.includecache
│ │ │ │ ├── cmake_clean.cmake
│ │ │ │ ├── DependInfo.cmake
│ │ │ │ ├── depend.internal
│ │ │ │ ├── depend.make
│ │ │ │ ├── flags.make
│ │ │ │ ├── hello.c.o
│ │ │ │ ├── link.txt
│ │ │ │ └── progress.make
│ │ │ └── progress.marks
│ │ ├── cmake_install.cmake
│ │ ├── libhello.so
│ │ └── Makefile
│ └── Makefile
├── CMakeLists.txt
└── lib
├── CMakeLists.txt
├── hello.c
└── hello.h
主文件CMakeLists.txt中的ADD_SUBDIRECTORY(lib)
的作用就是在编译环境下产生一个lib文件夹,将生成共享库的过程中生成的所有文件存放到该文件夹下,包括libhello.so文件。
如果你要指定 libhello.so 生成的位置,可以通过在主工程文件 CMakeLists.txt 中修改 ADD_SUBDIRECTORY(lib)指令来指定一个编译输出位置或者在 lib/CMakeLists.txt 中添加SET(LIBRARY_OUTPUT_PATH <路径>)
来指定一个新的位置。
注意
在 lib/CMakeLists.txt 中添加SET(LIBRARY_OUTPUT_PATH <路径>)
来指定一个新的位置 和 修改 ADD_SUBDIRECTORY(lib)指令来指定一个编译输出位置区别就是:
我们都可以通过 SET 指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量来指定最终的目标二进制的位置(指最终生成的 hello 或者最终的共享库libhello.so,不包含编译生成的中间文件)。
在 lib/CMakeLists.txt 中添加SET(LIBRARY_OUTPUT_PATH <路径>)
来指定一个新的位置,编译过程如下:
以构建共享库为例,初始文件结构:
├── CMakeLists.txt
└── lib
├── CMakeLists.txt
├── hello.c
└── hello.h
主文件CMakeLists.txt文件内容
PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
在 lib 目录下建立两个源文件 hello.c 与 hello.h
hello.c 内容如下:
#include “hello.h”
void HelloFunc()
{
printf(“Hello World\n”);
}
hello.h 内容如下:
#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>
void HelloFunc();
#endif
在 lib 目录下建立 CMakeLists.txt,内容如下:
SET(LIBHELLO_SRC hello.c)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/liI)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
cmake编译后文件结构为:
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.5.1
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ ├── CompilerIdC
│ │ │ │ ├── a.out
│ │ │ │ └── CMakeCCompilerId.c
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ └── CMakeCXXCompilerId.cpp
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── feature_tests.bin
│ │ ├── feature_tests.c
│ │ ├── feature_tests.cxx
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ └── TargetDirectories.txt
│ ├── cmake_install.cmake
│ ├── lib
│ │ ├── CMakeFiles
│ │ │ ├── CMakeDirectoryInformation.cmake
│ │ │ ├── hello.dir
│ │ │ │ ├── build.make
│ │ │ │ ├── C.includecache
│ │ │ │ ├── cmake_clean.cmake
│ │ │ │ ├── DependInfo.cmake
│ │ │ │ ├── depend.internal
│ │ │ │ ├── depend.make
│ │ │ │ ├── flags.make
│ │ │ │ ├── hello.c.o
│ │ │ │ ├── link.txt
│ │ │ │ └── progress.make
│ │ │ └── progress.marks
│ │ ├── cmake_install.cmake
│ │ └── Makefile
│ ├── liI
│ │ └── libhello.so
│ └── Makefile
├── CMakeLists.txt
└── lib
├── CMakeLists.txt
├── hello.c
└── hello.h
可以看到,libhello.so文件单独储存在liI文件中。
2、设置SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
以下面例子说明:
文件结构:
.
├── CMakeLists.txt
└── src
├── CMakeLists.txt
└── main.c
主工程文件CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
main.c:
#include <stdio.h>
int main()
{
printf("Hello world from t1");
return 0;
}
同目录下的CMakeLists.txt:
ADD_EXECUTABLE(hello main.c)
cmake编译后的文件结构:
设置SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)后
主工程文件CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(src)
不指定生成二进制文件工程中的文件存放位置。
main.c:
#include <stdio.h>
int main()
{
printf("Hello world from t1");
return 0;
}
同目录下的CMakeLists.txt:
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
ADD_EXECUTABLE(hello main.c)
cmake编译后的文件结构:
可以看到hello单独存放到lib文件夹下。