cmake : add_library详解

add_library是写cmake必备的一个函数,但一直没仔细研究过,今天把它折解下。主要参考
cmake官方文档

normal library

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [source1] [source2 ...])

添加名为name的库,库的源文件可指定,也可用target_sources()后续指定。
库的类型是STATIC(静态库)/SHARED(动态库)/MODULE(模块库)之一。

name属性必须全局唯一
生成的library名会根据STATICSHARED成为name.aname.lib
这里的STATICSHARED可不设置,通过全局的BUILD_SHARED_LIBSFALSETRUE来指定
windows下,如果dll没有export任何信息,则不能使用SHARED,要标识为MODULE

添加的库会被输出到以下几个目录
ARCHIVE_OUTPUT_DIRECTORY, LIBRARY_OUTPUT_DIRECTORYRUNTIME_OUTPUT_DIRECTORY,详见cmake 常用设定及函数
设置EXCLUDE_FROM_ALL,可使这个library排除在all之外,即必须明确点击生成才会生成

imported library

add_library(<name> <SHARED|STATIC|MODULE|OBJECT|UNKNOWN> IMPORTED
            [GLOBAL])

这种用法直接导入已经生成的库,cmake不会给这类library添加编译规则。
这种用法的关键在于添加变量IMPORTED
另外,GLOBAL可用于设置这个library为全局可见。
常规和imported的library的属性不同:

  1. 常规的library,其属性以INTERFACE_开头
  2. imported的library,其属性以IMPORTED_开头

INTERFACE_IMPORTED_开头的变量有哪些,参见interface libraries,还需再研究。

imported的library最重要的几个属性是:

  1. IMPORTED_LOCATION:标明library在硬盘上的位置,可以用更具体的IMPORTED_LOCATION_<CONFIG>的标注,其中的<CONFIG>可以是DEBUG/RELEASE或其他
  2. IMPORTED_OBJECTS:标明对象library在硬盘上的位置,相应的有IMPORTED_OBJECTS_<CONFIG>来标识具体编译类型
  3. PUBLIC_HEADER:如果install这个library的话,这个值保存头文件的目录

UNKNOWN类型,在不需要明确library类型时使用。

object library

add_library(<name> OBJECT <src>...)

库的类型固定为OBJECT,这种库编译了源文件,但不链接。实际中没用过,没有仔细研究。使用方法:

add_library(... $<TARGET_OBJECTS:objlib> ...)
add_executable(... $<TARGET_OBJECTS:objlib> ...)

alias library(别名库)

为给定library添加一个别名,后续可使用<name>来替代<target>

add_library(<name> ALIAS <target>)

使用有如下限制:

  1. <target>不能是ALIAS
  2. 可用于判断target是否存在、链接。
  3. ALIAS的library不能修改属性,不能调用set_property(), set_target_properties()target_link_libraries()等方法
  4. 不能用于install()

interface library

创建一个接口库,

add_library(<name> INTERFACE [IMPORTED [GLOBAL]])

这类库有属性,能install()exportimported,但可能没有build过程。像纯头文件库完全针对target的设计(这条参见interface libraries
所有INTERFACE _*属性从如下几个方法中设置
set_property()target_link_libraries(INTERFACE)target_link_options(INTERFACE)target_include_directories(INTERFACE)target_compile_options(INTERFACE)target_compile_definitions(INTERFACE)target_sources(INTERFACE)

手工配置库

参考 cmake引入外部库

静态库

add_library(baz STATIC IMPORTED)
set_target_properties(baz PROPERTIES
IMPORTED_LOCATION_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/libbaz.a
IMPORTED_LOCATION_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/libbazd.a)

静态库(添加依赖项)

add_library(bar STATIC IMPORTED)
set_target_properties(bar PROPERTIES
IMPORTED_LOCATION_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/libbar.a
IMPORTED_LOCATION_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/libbard.a
IMPORTED_LINK_INTERFACE_LIBRARIES baz) # <-- dependency is here

动态库

add_library(bar SHARED IMPORTED)
set_property(TARGET bar PROPERTY IMPORTED_LOCATION c:/path/to/bar.dll)
set_property(TARGET bar PROPERTY IMPORTED_IMPLIB c:/path/to/bar.lib) # 多了lib信息
add_executable(myexe src1.c src2.c)
target_link_libraries(myexe bar)

当然,也可以直接引用库文件

TARGET_LINK_LIBRARIES(skiaSampleCode
debug skiaCored.lib
optimized skiaCore.lib)
  • 37
    点赞
  • 191
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: CMake 是一种用于自动生成构建脚本的工具,可以帮助开发者简化构建过程。当使用 CMake 时,有时会出现 "cmake_c_compiler not set, after enablelanguage" 的错误信息。 这个错误通常是由于没有正确设置 C 编译器引起的。CMake 在构建过程中需要根据项目的语言要求来选择合适的编译器,如果没有设置编译器,就会出现这个错误。 解决这个问题的方法是通过设置正确的编译器路径来修复。可以通过在 CMakeLists.txt 文件中添加如下代码来指定编译器路径: ``` set(CMAKE_C_COMPILER gcc) # 设置 C 编译器路径为 gcc ``` 在上述代码中,使用了 gcc 作为示例,实际上应该根据你的环境和需求来设置合适的编译器路径。 另外,如果你需要使用其他语言(例如 C++),也可以通过类似的方式设置对应的编译器。比如,对于 C++ 的设置可使用以下代码: ``` set(CMAKE_CXX_COMPILER g++) # 设置 C++ 编译器路径为 g++ ``` 完成以上设置后,重新运行 CMake,在编译过程中就不会再出现 "cmake_c_compiler not set, after enablelanguage" 的错误信息了。 总之,"cmake_c_compiler not set, after enablelanguage" 错误是由于没有正确设置 C 编译器引起的,通过设置正确的编译器路径,可以解决这个问题。 ### 回答2: cmake是一个跨平台的开源构建工具,它能够协助程序开发者自动进行软件构建的工作。当使用cmake构建项目时,如果在CMakeLists.txt文件中出现以下错误信息: "cmake error: cmake_c_compiler not set, after enablelanguage cmake error: cma" 这个错误意味着在CMakeLists.txt文件中启用了C语言支持(通过enable_language(C)命令),但是没有指定C编译器。 解决这个错误的方法是在CMakeLists.txt文件中明确指定C编译器。可以使用set命令来设置C编译器,例如: set(CMAKE_C_COMPILER gcc) 在上面的例子中,我们明确指定了C编译器为gcc。你可以根据你的项目需求和系统环境选择合适的C编译器。 当然,如果你没有特别要求使用某个特定的C编译器,你也可以忽略这个错误。CMake会尝试自动选择一个默认的C编译器来构建你的项目。 总之,通过在CMakeLists.txt文件中明确指定C编译器,你可以解决"cmake error: cmake_c_compiler not set, after enablelanguage cmake error: cma"这个错误。希望这个回答能对你有所帮助。 ### 回答3: cmake error: cmake_c_compiler not set, after enablelanguage cmake error: cma 说明在使用CMake时出现了一些问题。 这个错误发生在我们在CMakeLists.txt文件中启用了某个语言(比如C语言),但在设置编译器时出现了问题。 解决这个问题的方法是在CMakeLists.txt文件中正确设置C编译器。我们可以通过在文件的开头添加以下代码来设置编译器: ``` cmake_minimum_required(VERSION 3.0) # 假设我们使用的是CMake 3.0版本或更高版本 project(MyProject) enable_language(C) # 启用C语言支持 set(CMAKE_C_COMPILER gcc) # 设置C编译器为gcc(这里以gcc为例) # ... ``` 在这个例子中,我们使用了gcc作为C编译器,你可以根据你的需要修改为适合你的编译器。你也可以使用`-DCMAKE_C_COMPILER`选项在命令行中传递编译器的路径。 当我们正确设置了C编译器后,就可以使用`cmake`命令重新生成Makefile并进行编译了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值