本文主要分析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个变量的作用了。