[C++][CMake] set_target_properties called with incorrect number of arguments

1 简介

这篇文章将探讨了在使用CMake构建C++项目时,调用set_target_properties函数时参数数量不正确所引发的问题。

2 错误案例

以下为可能发生错误的案例

include_directories (${CMAKE_SOURCE_DIR}/common)
find_package(Threads)

add_library (libusbmuxd SHARED libusbmuxd.c sock_stuff.c ${CMAKE_SOURCE_DIR}/common/utils.c)
find_library (PTHREAD pthread)
target_link_libraries (libusbmuxd ${CMAKE_THREAD_LIBS_INIT})

# 'lib' is a UNIXism, the proper CMake target is usbmuxd
# But we can't use that due to the conflict with the usbmuxd daemon,
# so instead change the library output base name to usbmuxd here
set_target_properties(libusbmuxd PROPERTIES OUTPUT_NAME usbmuxd)
set_target_properties(libusbmuxd PROPERTIES VERSION ${LIBUSBMUXD_VERSION})
set_target_properties(libusbmuxd PROPERTIES SOVERSION ${LIBUSBMUXD_SOVERSION})

install(TARGETS libusbmuxd
    ARCHIVE DESTINATION lib${LIB_SUFFIX}
    LIBRARY DESTINATION lib${LIB_SUFFIX}
)
install(FILES usbmuxd.h usbmuxd-proto.h DESTINATION include)

以上文件可能报错如下:

CMake error at CMakeLists.txt:12 (set_target_properties):
    set_target_properties called with incorrect number of arguments

3 原因分析

set_target_properties 函数的语法格式为

SET_TARGET_PROPERTIES(
    target1 target2 ... targetM
    PROPERTIES 
    prop1 val1 prop2 val2 ... propN valN
)

变量LIBUSBMUXD_VERSION和LIBUSBMUXD_SOVERSION未定义,因此命令的语法是

SET_TARGET_PROPERTIES(target PROPERTIES name value)

很显然,这里少了value变量

4 解决方法

要解决这个问题,请尝试引用变量;使用“$ {LIBUSBMUXD_SOVERSION}”应确保即使变量未定义,它也会采用空字符串的值,从而遵守语法。

include_directories (${CMAKE_SOURCE_DIR}/common)
find_package(Threads)

add_library (libusbmuxd SHARED libusbmuxd.c sock_stuff.c ${CMAKE_SOURCE_DIR}/common/utils.c)
find_library (PTHREAD pthread)
target_link_libraries (libusbmuxd ${CMAKE_THREAD_LIBS_INIT})

# 'lib' is a UNIXism, the proper CMake target is usbmuxd
# But we can't use that due to the conflict with the usbmuxd daemon,
# so instead change the library output base name to usbmuxd here
set_target_properties(libusbmuxd PROPERTIES OUTPUT_NAME usbmuxd)
set_target_properties(libusbmuxd PROPERTIES VERSION " ${LIBUSBMUXD_VERSION}")
set_target_properties(libusbmuxd PROPERTIES SOVERSION " ${LIBUSBMUXD_SOVERSION}")

install(TARGETS libusbmuxd
    ARCHIVE DESTINATION lib${LIB_SUFFIX}
    LIBRARY DESTINATION lib${LIB_SUFFIX}
)
install(FILES usbmuxd.h usbmuxd-proto.h DESTINATION include)
`add_dependencies` 是 CMake 中的一个命令,用于设置一个特定的目标(通常是通过 `add_*` 函数创建的)依赖于其他的命令、目标或者文件。这使得 CMake 可以确保在执行某个目标(例如构建可执行文件)之前,相关的前置任务(如配置、生成头文件等)已经被成功完成。 当你在 `add_executable` 或 `add_library` 等函数之后调用 `add_dependencies`,你需要指定目标名作为第一个参数,然后跟随着一个或多个依赖项。依赖项可以是: 1. **另一个目标**:这意味着当前的目标只有在所依赖的那个目标完成后才能继续。 2. **自定义命令**:如果前面定义了 `add_custom_command` 或 `add_custom_target`,你可以依赖这些命令或目标来触发特定的动作。 3. **文件或目录**:如果有一个文件或目录需要在目标之前创建,也可以将其作为依赖。 示例: ```cmake add_executable(MyApp main.cpp) add_custom_command(target GenerateHeader DEPENDS SomeConfigFile COMMAND myscript.sh) add_dependencies(MyApp GenerateHeader) # 确保在编译 MyApp 之前,GenerateHeader 被执行过 # 如果有个预处理步骤生成了 header.h,可以这样添加: add_custom_command(TARGET MyApp PRE_BUILD command_to_generate_header) add_dependencies(MyApp command_to_generate_header) ``` 在这个例子中,`MyApp` 需要在 `GenerateHeader` 完成后编译,而 `command_to_generate_header` 则是在 MyApp 编译之前运行的。这样可以确保项目的构建顺序和依赖关系清晰,避免因为缺少必要的中间产物而导致编译失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值