Я пытаюсь скомпилировать сгенерированный код thrift в свой источник. Материал thrift генерируется в CMAKE_CURRENT_BINARY_DIR, затем я добавляю сгенерированные файлы cpp в свою библиотеку с помощью SET_SOURCE_FILES_PROPERTIES(${ThriftGeneratedFiles} PROPERTIES
GENERATED 1
COMPILE_OPTIONS ""
)
Затем я добавляю путь включения к сгенерированным файлам, используя TARGET_INCLUDE_DIRECTORIES с ключевым словом SYSTEM. Когда я пытаюсь скомпилировать его, поскольку мой модуль компилируется с -Wsuggest-override, он не может скомпилировать сгенерированный файл cpp с can be marked override [-Werror=suggest-override]. Не понимаю, почему, разве SET_SOURCE_FILES_PROPERTIES не должен решить эту проблему?
CСделать фрагмент файла
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 -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-limits -Werror -Wempty-body -Wuninitialized -Winit-self -Wmissing-declarations -Wswitch-bool -Wlogical-not-parentheses -Wsizeof-array-argument -Wbool-compare -Wtype-limits -Waddress -Wmisleading-indentation -Wshift-negative-value -Wtautological-compare -Wnull-dereference -Wduplicated-cond -Wnonnull -Wnonnull-compare -Wignored-qualifiers -Wmissing-braces -Wmissing-include-dirs -Wparentheses -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-move-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 In file included from /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: error: ‘virtual const char* MyProject::ThriftCapiException::what() const’ can be marked override [-Werror=suggest-override] const char* what() const throw();
Как видно, применяются все флаги компиляции.
"поскольку мой модуль компилируется с -Wsuggest-override" - Вы устанавливаете эту опцию через переменную CMAKE_CXX_FLAGS? Если это так, опция применяется к файлу каждый.cpp; Свойство COMPILE_OPTIONS не включает параметры из переменной CMAKE_CXX_FLAGS.
Я установил его с помощью ADD_COMPILE_OPTIONS, должно ли работать?
И нет свойства COMPILE_OPTIONS для исходные файлы: cmake.org/cmake/help/v3.7/manual/…. Свойство существует только для цели и каталоги. Вы можете создать Библиотека OBJECT из сберегательных источников. Для этой библиотеки вы можете установить (то есть очистить) свойство COMPILE_OPTIONS. Затем используйте полученные файлы объектов в своей основной библиотеке.
Ты прав. Думаю, это должен быть COMPILE_FLAGS?
Нет, свойство исходного файла COMPILE_FLAGS содержит только флаги дополнительный, то есть его очистка не отменяет флаги, примененные для всей цели.
Ага, уже разобрался. Хотели бы вы намекнуть, что является правильным решением в такой ситуации?
Вы, вероятно, прочитали мой комментарий, прежде чем я его обновил. Пожалуйста, перечитайте это.
ты прав, я пропустил это обновление, сразу попробую
работал как шарм. пожалуйста, превратите свой комментарий в ответ
Хорошо, я сделаю это позже. Не могли бы вы в то время обновить свой вопрос, добавив в него информацию, которую вы разместили в комментариях? Я имею в виду использование команды ADD_COMPILE_OPTIONS для добавления опции компилятора -Wsuggest-override. Как я сказал ранее, важно, чтобы вы использовали эту функцию для добавления параметра (а не переменную CMAKE_CXX_FLAGS).
Добавил ADD_COMPILE_OPTIONS, что-нибудь еще?





Свойства на исходные файлы, такие как COMPILE_DEFINITIONS и COMPILE_FLAGS, могут использовать только Добавить в качестве параметра компиляции. Используя эти свойства, невозможно скомпилировать параметры перезаписывать (удалять) для цели. (И параметры, добавленные ADD_COMPILE_OPTIONS, в конечном итоге назначаются для цели).
Вы можете создать библиотеку 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>
)
Пожалуйста, покажите сообщение об ошибке полный, которое содержит информацию о том, какой файл скомпилирован, включает цепочку и так далее.