当前位置: 首页 > 知识库问答 >
问题:

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

苏季同
2023-03-14

我正在尝试将生成的< code>thrift代码编译到我的源代码中。将< code>thrift内容生成到< code > CMAKE _ CURRENT _ BINARY _ DIR 中,然后我使用< code>SYSTEM关键字将生成的cpp文件添加到我的库中。当我试图编译它时,由于我的模块使用< code>-Wsuggest-override进行编译,它无法编译生成的cpp文件,因为< code >可以标记为override[-Werror = suggest-override]。我不明白为什么,难道< code > SET _ SOURCE _ FILES _ PROPERTIES 不应该解决这个问题吗?< br>
CMake文件片段

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

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

共有1个答案

澹台华采
2023-03-14

COMPILE_DEFINITIONSCOMPILE_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>
)
 类似资料:
  • 问题内容: 我应该使用什么编译器(我正在使用gcj 4.x)选项来生成供我的Java应用程序在Windows中运行的“ exe”文件? 问题答案: 要编译Java程序MyJavaProg.java,请输入: 要链接它,请使用以下命令: 然后链接以创建可执行文件mycxxprog.exe

  • 问题内容: 由于某些原因,CMake的C和C++编译器默认设置为。 cmake -D CMAKE_C_COMPILER = / usr / bin / gcc -D CMAKE_CXX_COMPILER = / usr / bin / g ++ 但我得到了错误 CMake错误:源目录[当前目录] / CMAKE_CXX_COMPILER = / usr / bin / g ++“不存在。 为什么C

  • 问题内容: 有没有办法查看在* nix中使用了哪些编译器和标志来创建可执行文件?我已经编译了一个旧版本的代码,我想看看它是经过优化还是未经优化而编译的。Google并没有太大的帮助,但是我不确定我使用的关键字是否正确。 问题答案: gcc 为此提供了一个选项: 之后,ELF可执行文件将包含带有该信息的部分。 当然,如果没有该选项编译的可执行文件将无法使用。 对于简单的优化情况,如果文件是使用调试信

  • 以下是我的cmake代码: 我尝试从链接中合并步骤,但没有工作,并得到以下错误: /usr/bin/ld:尝试动态对象的静态链接`/usr/lib/x86_64-linux-gnu/libglu.so'collect2:错误:ld返回1退出状态src/cmakefiles/wwest-export-app.out.dir/build.make:774:recipe for targe'bin/ww

  • [ERROR]$home/workspace/javaExamplePbServiceCall/src/main/java/example/ServiceCallPiqi.java:[13,23]ERROR:';‘预期 手工编译产生100个错误,这里是第一个: javac-cp$home/.m2/repository/com/google/protobuf/protobuf-java/2.4.1/

  • Compiling One Directory # compileall_compile_dir.py import compileall import glob def show(title): print(title) for filename in glob.glob('examples/**', recursi