首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMAKE节省生成的文件编译器选项

CMAKE节省生成的文件编译器选项
EN

Stack Overflow用户
提问于 2018-09-26 12:39:45
回答 1查看 1K关注 0票数 0

我正在尝试将生成的thrift代码编译到我的源代码中。将thrift内容生成到CMAKE_CURRENT_BINARY_DIR中,然后使用SET_SOURCE_FILES_PROPERTIES(${ThriftGeneratedFiles} PROPERTIES GENERATED 1 COMPILE_OPTIONS "" )将生成的cpp文件添加到库中。

然后使用TARGET_INCLUDE_DIRECTORIESSYSTEM关键字将包含路径添加到生成的文件中。当我试图编译它时,因为我的模块用-Wsuggest-override编译,所以它无法用can be marked override [-Werror=suggest-override]编译生成的cpp文件。我不明白为什么,SET_SOURCE_FILES_PROPERTIES不应该解决这个问题吗?

CMake文件段

代码语言:javascript
复制
ADD_COMPILE_OPTIONS(
        ...
        ...
        -Wsuggest-override
        ...
        ...
)
FIND_PROGRAM(THRIFT_COMPILER thrift ${_VCPKG_ROOT_DIR}/buildtrees/thrift/x64-linux-rel/compiler/cpp/bin/ NO_DEFAULT_PATH)
SET(ThriftOutputDir ${CMAKE_CURRENT_BINARY_DIR}/thrift/gen/)
FILE(MAKE_DIRECTORY ${ThriftOutputDir})

SET(ThriftGeneratedFiles
    ${ThriftOutputDir}/MyServer.cpp
    ${ThriftOutputDir}/My_types.cpp
    ${ThriftOutputDir}/My_constants.cpp
    )

ADD_CUSTOM_COMMAND(
        OUTPUT
        generated.timestamp
        COMMAND
        ${THRIFT_COMPILER} --gen cpp:no_default_operators -out ${ThriftOutputDir} ${CMAKE_SOURCE_DIR}/protocols/My.thrift
        WORKING_DIRECTORY
        ${CMAKE_BINARY_DIR}
        COMMENT "Generating source code from Thrift definition")
ADD_CUSTOM_TARGET(RunThriftCompiler
                  DEPENDS
                  generated.timestamp
                  COMMENT "Checking if re-generation is required")

ADD_LIBRARY(MyProject SHARED
            ${SOURCES}
            ${ThriftGeneratedFiles}
            )

SET_SOURCE_FILES_PROPERTIES(${ThriftGeneratedFiles} PROPERTIES
                            GENERATED 1
                            COMPILE_OPTIONS ""
                            )
TARGET_INCLUDE_DIRECTORIES(MyProject SYSTEM PRIVATE
                           ${PROTOBUF_INCLUDE_DIR}
                           ${ThriftOutputDir}
                           )

汇编电文:

cd /home/user/Development/Project/Project16/cmake-build-debug/lib/MyProject & /usr/bin/c++ -DCARES_STATICLIB -DMyProject_EXPORTS -I/home/user/Development/Project/Project16/lib/include/MyProject -I/home/user/Development/Project/Project16/lib/include -isystem /home/user/Development/Project/Project16/cmake-build-debug/ext/etcd -isystem /home/user/Development/Project/Project16/cmake-build-debug/protocols/home/user/Development/Project/Project16/ext/spdk/include /home/user/Development/vcpkg/installed/x64-linux/include -isystem -isystem -g -fPIC -include MyProject.h -fPIC --fPIC-fno-省略帧-指针-m调=核心-avx-i -mavx -进军=核心-avx-i -fno-plt -g -f堆栈-全f堆栈-检查-rdynamic -Wno-错误=未使用-参数-Wno-错误=未使用-但设置参数-Wshadow -Werror=address -error=数组-界-error=char-下标-error=enum-error=隐式-int-error=隐式- -Werror=comment -Werror=format -Werror=main -error=缺失-大括号-Werror=nonnull -error=指针-error=返回类型-error=序列-Wstrict混叠=1 -Werror=switch -Werror=trigraphs -Werror=uninitialized -error=1-Werror=switch-Werror=trigraphs-Werror=uninitialized-error=未知-限定符-Werror =符号比较-Werror=type--Werror-Winit body -Wuninitialized -Winit--Wuninitialized- -Wnonnull -Wno bool-Wlogical Wlogical declarations Wbool-比较-Wtype-限制-Waddress -W误导性-缩进-Wshift-负-值-Wbool比较-Wnull-取消引用--Wnonnull-cond--Wnonnull-Wno-Wnonnull-忽略-限定符-w遗失-括号-w遗失-包括-dirs-w序列点-Wno-返回本地-addr-Wbool类型-Wtrigraphs -w未使用-类型无效-内存-模型-是否可能-未初始化-Wno帧-地址-Wtrampolines -Wfloat-相等-Wno-无堆-对象-Wold-样式- -Wunused -Wcast但是-但是-设置-参数-Wframe大于=1100000-w指针-arith-Wwrite- -Wclobbered --Wclobbered-Wsizeof指针-memaccess-Wmemset-transposed args-Wlogical w冗余-decls-Wold pch -Wvarargs -Wno-Wvarargs-运行性能-w挥发性-寄存器-var-禁用-Wcast- -Wclobbered-Wcast--Wclobbered-Wcast-Wcast-Wcast-qual -Wnon--虚拟-dtor-Woverloaded/home/user/Development/Project/Project16/cmake-build-debug/lib/MyProject/thrift/gen/MyProject_types.cpp:7:0: /home/user/Development/Project/Project16/cmake-build-debug/lib/MyProject/thrift/gen/MyProject_types.h:72:15:错误文件中包含的cpp:‘virtual* MyProject::ThriftCapiException::what() const’可以标记为覆盖-Werror=suggest*什么() const抛出();

如所示,将应用所有编译标志。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-01 20:36:28

源文件上的属性(如COMPILE_DEFINITIONSCOMPILE_FLAGS )只能添加(编译选项)。使用这些属性,不可能为目标覆盖(删除)编译选项。( ADD_COMPILE_OPTIONS添加的选项最终会分配给目标)。

您可以从节约生成的源创建OBJECT库。对于该库,可以设置(即清除) 选项属性。然后,可以在主库中使用生成的对象文件:

代码语言:javascript
复制
# Object files for thrift-generated sources
add_library(thriftGenerated OBJECT ${ThriftGeneratedFiles})
# For these files clear compile options which has been set before
set_property(TARGET thriftGenerated PROPERTY COMPILE_OPTIONS)

# Then use object files for thrift-generated sources in other library
add_library(MyProject SHARED
    ${SOURCES}
    $<TARGET_OBJECTS:thriftGenerated>
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52517977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档