Cmake之文件目录规划与设置
本文主要分析cmake中4个变量的区别:
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY:默认存放静态库的文件夹位置;
- CMAKE_LIBRARY_OUTPUT_DIRECTORY:默认存放动态库的文件夹位置;
- LIBRARY_OUTPUT_PATH:默认存放库文件的位置,如果产生的是静态库并且没有指定 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 则存放在该目录下,动态库也类似;
- CMAKE_RUNTIME_OUTPUT_DIRECTORY:存放可执行软件的目录;
上面就是结论,如果你理解了,下面的实验就不需要看了。如果没有理解,请根据实验进行理解。
linux在程序编译过程中产生的3类有用文件为:.a结尾的静态库文件,.so结尾的动态库文件和可执行文件。下面我们通过一个立在来说明上面4个变量的使用。
构建一个结构如下的文件夹: . ├── CMakeLists.txt ├── archive ├── fun │ ├── CMakeLists.txt │ └── fun.cpp ├── library ├── output └── runtime 其中 ./CMakeListLists.txt 的内容为:
cmake_minimum_required(VERSION 3.1) project(TEST) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/archive) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/library) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/runtime) set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/path) add_subdirectory(fun)
fun/CMakeLists.txt 的内容为:
cmake_minimum_required(VERSION 3.1) project(fun) add_library(fun fun.cpp)
fun/fun.cpp 的内容为:
int add(int a, int b){return a+b;} int main(){return 0;}
测试 CMAKE_ARCHIVE_OUTPUT_DIRECTORY
-
执行 cmake .; make,可以在 archive 下看见产生了静态库文件 libfun.a。 如果将 ./CMakeLists.txt 中的第3行注释掉,执行 make,可以发现在 path 下产生了 libfun.a; 如果将 ./CMakeLists.txt 中的第3行、第6行都注释掉,执行 make,可以发现在 fun 下产生了 libfun.a。
测试 CMAKE_LIBRARY_OUTPUT_DIRECTORY
-
先将 fun/CMakeLists.txt 的第三行修改为:add_library(fun SHARED fun.cpp) 执行 make,可以在 library 目录下看到 libfun.so 文件 (如果是mac os系统,则可以看到 libfun.dylib) 如果将 ./CMakeLists.txt 中的第4行注释掉,执行 make,可以发现在 path 下产生了 libfun.so 文件; 如果将 ./CMakeLists.txt 中的第4行、第6行都注释掉,执行 make,可以发现在 fun 下产生了 libfun.so 文件;
测试 CMAKE_RUNTIME_OUTPUT_DIRECTORY
-
先将 fun/CMakeLists.txt 的第三行修改为:add_executable(exe_file fun.cpp) 执行 make,在 runtime 下创建了可执行文件 exe_file 将 ./CMakeLists.txt 中的第5行注释掉,执行 make,exe_file 在 fun 文件夹下创建。
通过上面的3个实验应该就可以理解4个变量的作用了。