多个CMake目标的target_compile_definitions?

时间:2017-12-02 18:49:01

标签: cmake dry idiomatic compiler-options

been told执行诸如直接在CMake中设置CFLAGS这样的事情是不好的做法,相反,我应该使用target_compile_definitions()命令。< / p>

好的,但是 - 如果我想对多个(独立)目标使用相似/相同的定义怎么办?我不想一遍又一遍地重复自己。

3 个答案:

答案 0 :(得分:4)

我看到三种可能的方式:

  1. 使用target_compile_definitions(... INTERFACE/PUBLIC ...)的首选方法,它可以通过target_link_libraries()命令将编译器定义自我传播到目标,具体取决于它。

  2. 使用set_property(TARGET target1 target2 ... APPEND PROPERTY COMPILE_DEFINITIONS ...)为多个目标设置相同的定义。

  3. 您仍然可以使用&#34;旧命令&#34; add_definitions()remove_definitions()修改COMPILE_DEFINITIONS目录属性(这将预设此目录范围内的所有COMPILE_DEFINITIONS目标属性)。

  4. 参考

答案 1 :(得分:0)

如果您有一堆具有某些常见/相似功能的目标,则可能需要简单地循环操作它们!记住-CMake与GNU Make不同,它是一种成熟的脚本语言(嗯,有点)。所以你可以这样写:

set(my_targets
    foo
    bar
    baz)

foreach(TARGET ${my_targets})
    add_executable(${TARGET} "${TARGET}.cu")
    target_compile_options(${TARGET} PRIVATE "--some_option=some_value")
    target_link_libraries(${TARGET} PRIVATE some_lib)
    # and so on
    set_target_properties(
        ${TARGET}
        PROPERTIES
        C_STANDARD 99
        C_STANDARD_REQUIRED YES
        C_EXTENSIONS NO )
endforeach(TARGET)

您还可以初始化一个空的目标列表,然后在此处和此处添加目标,最后最终将您的通用选项和设置集中应用于所有这些对象。

注意:在本示例中,我添加了PRIVATE编译选项,但是如果您需要其中一些使用 目标传播到目标,则可以使它们PUBLIC

答案 2 :(得分:0)

另一个巧妙的解决方案是使用所有必需的属性和编译器定义定义一个接口库目标(一个不产生任何二进制文件的假目标),然后将其他现有目标链接到它

示例:

 
const Pagination = React.forwardRef(({showPerPage, onPaginationChange, totalProvider}, ref) => {
    const [counter, setCounter] = useState(1);
    useEffect(()=>{
        const value = showPerPage * counter;
        onPaginationChange(value - showPerPage, value);
    },[counter]);
    const onButtonClick = (type) => {
        if(type==='prev'){
            if(counter === 1){
                setCounter(1);
            }else {
                setCounter(counter - 1);
            }
        }else if( type=== 'next'){
            if(Math.ceil(totalProvider/showPerPage)=== counter){
                setCounter(counter);
            }else {
                setCounter(counter + 1);
            }
        }
    }
    resetCounter() {
        setCounter(1);
    }
    return (
        <div className="paginationWrapper" ref={ref}>
            <span id="prevBtn" onClick={()=>onButtonClick('prev')} className="disable">Prev.</span>
            <div className="numberOfItems">
                <span id="startCounter">{counter}</span>of<span>{Math.ceil(totalProvider/showPerPage)}</span>    
            </div>   
            <span id="nextBtn" onClick={()=>onButtonClick('next')}>Next</span>        
        </div>
    )
})


export default Pagination

参考:

https://cmake.org/cmake/help/latest/command/add_library.html#interface-libraries