【问题标题】:CMAKE thrift generated files compiler optionsCMAKE thrift 生成的文件编译器选项
【发布时间】:2019-03-02 05:54:51
【问题描述】:

我正在尝试将生成的thrift 代码编译到我的源代码中。 thrift 的东西生成到 CMAKE_CURRENT_BINARY_DIR 然后我将生成的 cpp 文件添加到我的库中,SET_SOURCE_FILES_PROPERTIES(${ThriftGeneratedFiles} PROPERTIES GENERATED 1 COMPILE_OPTIONS "" )
然后,我使用 TARGET_INCLUDE_DIRECTORIESSYSTEM 关键字将包含路径添加到生成的文件中。当我尝试编译它时,由于我的模块使用-Wsuggest-override 编译,它无法使用can be marked override [-Werror=suggest-override] 编译生成的cpp 文件。我不明白为什么,SET_SOURCE_FILES_PROPERTIES 不应该解决这个问题吗?

CMake 文件 sn-p

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 -调试/ext/etcd -isystem /home/user/Development/Project/Project16/cmake-build-debug/protocols -isystem /home/user/Development/Project/Project16/ext/spdk/include -isystem /home/user/Development/vcpkg/installed/x64-linux/include -isystem /home/user/Development/Project/Project16/cmake -build-debug/lib/MyProject/thrift/gen -g -fPIC -include MyProject.h -fPIC -fstrict-aliasing -ffunction-sections -fno-omit-frame-pointer -mtune=core-avx-i -mavx -march=core-avx-i -fno-plt - g -fstack-protector-all -fstack-check -rdynamic -Wno-error=unused-parameter -Wno-error=unused -Wno-error=unused-but-set-parameter -Wshadow -Werror=address -Werror=array- bounds -Werror=char-subscripts -Werror=enum-compare -Werror=implicit-int -Werror=implicit-function-declaration -Werror=comment -Werror=format -Werror=main -Werror=missing-braces -Werror=nonnull - Werror=pointer-sign -Werror=reorder -Werror=return-type -Werror=sequence-point -Wstrict-aliasing=1 -Werror=strict-overflow=1 -Werror=switch -Werror=trigraphs -Werror=uninitialized -Werror= unknown-pragmas -Wunused-function -Wunused-label -Wunused-value -Werror=volatile-register-var -Werror=clobbered -Werror=empty-body -Werror=ignored-qualifiers -Werror=sign-compare -Werror=type-限制 -Werror -Wempty-body -Wuninitialized -Winit-self -Wmissing-declarations -Wswitch-bool -Wlogical-n ot-括号 -Wsizeof-array-argument -Wbool-compare -Wtype-limits -Waddress -Wmisleading-indentation -Wshift-negative-value -Wtautological-compare -Wnull-dereference -Wduplicated-cond -Wnonnull -Wnonnull-compare -Wignored-限定符 -Wmissing-braces -Wmissing-include-dirs -W括号 -Wsequence-point -Wno-return-local-addr -Wreturn-type -Wtrigraphs -Wunused-local-typedefs -Winvalid-memory-model -Wmaybe-uninitialized -Wunknown- pragmas -Wframe-address -Wtrampolines -Wfloat-equal -Wno-free-nonheap-object -Wold-style-cast -Wunused-parameter -Wunused -Wunused-but-set-parameter -Wframe-larger-than=1100000 -Wpointer- arith -Wwrite-strings -Wclobbered -Wenum-compare -Wsizeof-pointer-memaccess -Wmemset-transposed-args -Wlogical-op -Wredundant-decls -Winvalid-pch -Wvarargs -Wvector-operation-performance -Wvolatile-register-var - Wdisabled-optimization -Wcast-align -Wcast-qual -Wnon-virtual-dtor -Woverloaded-virtual -Wodr -Wplacement-new=2 -Wdelete-incomplete -Wsized-deallocation -Wno-virtual-m ove-assign -Wsuggest-override -DBOOST_COROUTINES_NO_DEPRECATION_WARNING -DGTEST_LINKED_AS_SHARED_LIBRARY -D_GNU_SOURCE -DIGNORE_VALIDATION= -std=gnu++1z -o CMakeFiles/MyProject.dir/thrift/gen/MyProject_constants.cpp.o -c /home/user/Development/Project/Project16/cmake-build-debug/lib/MyProject/thrift/gen/MyProject_constants.cpp 在包含的文件中 /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: 错误:'virtual const char* MyProject::ThriftCapiException::what() const' 可以标记为 override [-Werror=suggest-override] const char* what() const throw();

如所见,所有编译标志都已应用。

【问题讨论】:

  • 请显示 complete 错误消息,其中包含有关编译哪个文件、包含链等信息。
  • "因为我的模块使用-Wsuggest-override 编译" - 你是否通过CMAKE_CXX_FLAGS 变量设置了这个选项?如果是这样,该选项将应用于 每个 .cpp 文件; COMPILE_OPTIONS 属性不包含来自 CMAKE_CXX_FLAGS 变量的选项。
  • 我使用 ADD_COMPILE_OPTIONS 设置它,它应该工作吗?
  • 并且源文件没有属性COMPILE_OPTIONScmake.org/cmake/help/v3.7/manual/…。该属性仅适用于 targetsdirectories。您可以从 thrift 生成的源中创建 OBJECT library。对于该库,您可以设置(即清除)COMPILE_OPTIONS 属性。然后,在您的主库中使用生成的对象文件。
  • 不,COMPILE_FLAGS 源文件属性仅包含 additional 标志,即清除它不会取消应用于整个目标的标志。

标签: c++ cmake


【解决方案1】:

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

您可以从 thrift 生成的资源中创建一个 OBJECT 库。对于该库,您可以设置(即清除)COMPILE_OPTIONS 属性。然后可以在您的主库中使用生成的目标文件:

# 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>
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多