cmake

1. add_library(ncnn SHARED IMPORTED)

最简单的方法是添加

include_directories(${CMAKE_SOURCE_DIR}/inc)
link_directories(${CMAKE_SOURCE_DIR}/lib)

add_executable(foo ${FOO_SRCS})
target_link_libraries(foo bar) # libbar.so is found in ${CMAKE_SOURCE_DIR}/lib

不会在每次编译器调用中添加INTERFACE_INCLUDE_DIRECTORIES标志的现代CMake版本将使用导入的库:

add_library(bar SHARED IMPORTED) # or STATIC instead of SHARED
set_target_properties(bar PROPERTIES
  IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/lib/libbar.so"
  INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/include/libbar"
)

set(FOO_SRCS "foo.cpp")
add_executable(foo ${FOO_SRCS})
target_link_libraries(foo bar) # also adds the required include path

如果设置INTERFACE_INCLUDE_DIRECTORIES不添加路径,则较旧版本的CMake也允许您使用target_include_directories(bar PUBLIC /path/to/include)。但是,此功能不再适用于CMake 3.6或更高版本。

2. get_filename_component

get_filename_component 得到一个完整文件名中的特定部分。

  get_filename_component(<VAR> FileName
                         PATH|ABSOLUTE|NAME|EXT|NAME_WE|REALPATH
                         [CACHE])

将变量设置为路径(PATH),文件名(NAME),文件扩展名(EXT),去掉扩展名的文件名(NAME_WE),完整路径(ABSOLUTE),或者所有符号链接被解析出的完整路径(REALPATH)。注意,路径会被转换为Unix的反斜杠(/),并且没有结尾的反斜杠。该命令已经考虑了最长的文件扩展名。如果指定了CACHE选项,得到的变量会被加到cache中。

  get_filename_component(<VAR> FileName
                         PROGRAM [PROGRAM_ARGS <ARG_VAR>]
                         [CACHE])

在FileName中的程序将会在系统搜索路径中被查找,或者是一个完整路径。如果与PRPGRAM一起给定了PROGRAM_ARGS选项,那么任何在Filename字符串中出现的命令行中选项将会从程序名中分割出来并存储在变量<ARG_VAR>中。这可以用来从一个命令行字符串中分离程序名及其选项。

例子

message("list file", ${CMAKE_CURRENT_LIST_FILE})
get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
message("prefix", ${_IMPORT_PREFIX})

输出为:

list file,/home/darknet/CM/10_device/ncnn-20210720-ubuntu-1604-shared/lib/cmake/ncnn/ncnn.cmake
prefix,/home/darknet/CM/10_device/ncnn-20210720-ubuntu-1604-shared/lib/cmake/ncnn

就是得到ncnn.cmake绝对路径文件夹