【问题标题】:cmake cxx flags only at compile timecmake cxx 仅在编译时标记
【发布时间】:2015-09-26 16:45:51
【问题描述】:

我想知道是否有办法只在编译时而不是在链接时将一些标志传递给编译器 (g++)。 让我用一个例子来解释一下:我想这样构建我的程序:

g++ -c source1.cpp -o source1.o
g++ -c source2.cpp -o source2.o
g++  source2.o source1.o -o myProgram.c

为此,我创建了一个 CMakeLists.txt 文件,其中包含:

PROJECT(myProgram)
include_directories("${CMAKE_SOURCE_DIR}/inc")
aux_source_directory("${CMAKE_SOURCE_DIR}/src" SRC_FILES)
add_executable(${PROJECT_NAME} ${SRC_FILES})

然后添加此行以将“-c”标志放入编译器:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -c")

但是通过这种方式,cmake 总是添加“-c”标志,即使 g++ 正在执行链接,即:

g++ -c source1.cpp -o source1.o
g++ -c source2.cpp -o source2.o
g++ -c  source2.o source1.o -o myProgram.c

并且逻辑上不会创建 myProgram,因为 g++ 没有运行链接(最后一条指令中的 -c)。

如何仅在编译时使用标志“-c”(或任何其他标志)?

【问题讨论】:

  • 您是否尝试运行您的代码?使用 CMake 时,无需为编译器指定“-c”选项。 CMake 知道如何构建源代码,以及之后如何链接它们。
  • 好的,我不怀疑 CMake 知道如何构建源代码,以及之后如何链接它们。也许在这种情况下,“-c”标志是无用的,但这只是一个例子,在某些情况下,我可能只需要在编译时使用一些带有 g++ 的标志,而可能只是在链接时使用其他标志。 Cmake 涵盖了这种情况。?
  • 即使对于 gcc,编译和链接也使用不相交的选项集。对于 CMake,CMAKE_CXX_FLAGScompile 选项(标志)。可以使用target_link_libraries 和其他一些 cmake 命令指定链接选项。

标签: cmake flags


【解决方案1】:

代替

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -c")

试试

add_compile_options(-c)

不知道为什么。您可以在同一个 add_compile_options 中使用多个空格分隔的选项。

【讨论】:

    【解决方案2】:

    我正在使用这个“CMakeLists.txt”

    PROJECT(prima_prova)
    cmake_minimum_required(VERSION 2.8)
    set(CMAKE_VERBOSE_MAKEFILE 1)
    
    include_directories("${CMAKE_SOURCE_DIR}/inc")
    aux_source_directory("${CMAKE_SOURCE_DIR}/src" SRC_FILES)
    add_executable(${PROJECT_NAME} ${SRC_FILES})
    

    当我运行 cmake .. 和 make 时,我得到了这个:

    make[2]: uscita dalla directory "/home/massimi/Scrivania/test/build"
    make -f CMakeFiles/prima_prova.dir/build.make     CMakeFiles/prima_prova.dir/build
    make[2]: ingresso nella directory "/home/massimi/Scrivania/test/build"
    [ 25%] Building CXX object CMakeFiles/prima_prova.dir/src/f1.cpp.o
    /usr/bin/c++    -I/home/massimi/Scrivania/test/inc    -o     CMakeFiles/prima_prova.dir/src/f1.cpp.o -c    /home/massimi/Scrivania/test/src/f1.cpp
    [ 50%] Building CXX object CMakeFiles/prima_prova.dir/src/main.cpp.o
    /usr/bin/c++    -I/home/massimi/Scrivania/test/inc    -o     CMakeFiles/prima_prova.dir/src/main.cpp.o -c    /home/massimi/Scrivania/test/src/main.cpp
    [ 75%] Building CXX object CMakeFiles/prima_prova.dir/src/f2.cpp.o
    /usr/bin/c++    -I/home/massimi/Scrivania/test/inc    -o   CMakeFiles/prima_prova.dir/src/f2.cpp.o -c    /home/massimi/Scrivania/test/src/f2.cpp
    [100%] Linking CXX executable prima_prova
    /usr/bin/cmake -E cmake_link_script CMakeFiles/prima_prova.dir/link.txt --  verbose=1
    /usr/bin/c++      CMakeFiles/prima_prova.dir/src/f1.cpp.o    CMakeFiles/prima_prova.dir/src/main.cpp.o    CMakeFiles/prima_prova.dir/src/f2.cpp.o  -o prima_prova -rdynamic 
    make[2]: uscita dalla directory "/home/massimi/Scrivania/test/build"
    

    当我在文件“CMakeLists.txt”中添加这一行时:

    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -c")
    

    当我运行 cmake .. 和 make 时,我得到了这个:

    make[2]: uscita dalla directory "/home/massimi/Scrivania/test/build"
    make -f CMakeFiles/prima_prova.dir/build.make   CMakeFiles/prima_prova.dir/build
    make[2]: ingresso nella directory "/home/massimi/Scrivania/test/build"
    [ 25%] Building CXX object CMakeFiles/prima_prova.dir/src/f1.cpp.o
    /usr/bin/c++    -c -I/home/massimi/Scrivania/test/inc    -o   CMakeFiles/prima_prova.dir/src/f1.cpp.o -c     /home/massimi/Scrivania/test/src/f1.cpp
    [ 50%] Building CXX object CMakeFiles/prima_prova.dir/src/main.cpp.o
    /usr/bin/c++    -c -I/home/massimi/Scrivania/test/inc    -o     CMakeFiles/prima_prova.dir/src/main.cpp.o -c    /home/massimi/Scrivania/test/src/main.cpp
    [ 75%] Building CXX object CMakeFiles/prima_prova.dir/src/f2.cpp.o
    /usr/bin/c++    -c -I/home/massimi/Scrivania/test/inc    -o     CMakeFiles/prima_prova.dir/src/f2.cpp.o -c    /home/massimi/Scrivania/test/src/f2.cpp
    [100%] Linking CXX executable prima_prova
    /usr/bin/cmake -E cmake_link_script CMakeFiles/prima_prova.dir/link.txt --verbose=1  
    /usr/bin/c++    -c   CMakeFiles/prima_prova.dir/src/f1.cpp.o    CMakeFiles/prima_prova.dir/src/main.cpp.o   CMakeFiles/prima_prova.dir/src/f2.cpp.o  -o prima_prova -rdynamic 
    c++: warning: CMakeFiles/prima_prova.dir/src/f1.cpp.o: linker input file     unused because linking not done
    

    变量 CMAKE_CXX_FLAGS 中的标志“-c”或任何其他标志总是被添加,即使在链接期间,不仅是在编译源代码时。

    【讨论】:

      【解决方案3】:

      CMAKE_CXX_FLAGS 变量仅在 CMake 编译源时在命令行中使用。在链接过程中使用CMAKE_EXE_LINKER_FLAGS(以及通过修改目标属性设置的标志),即使g++ 用作链接器可执行文件。

      【讨论】:

      • 正如 OP 显示的那样,每当修改 CMAKE_CXX_FLAGS(例如添加 -std=c++1y)时,cmake 也开始使用 CMAKE_CXX_FLAGS 进行链接。
      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 2020-06-14
      • 2021-02-20
      • 2016-03-04
      • 2022-07-12
      相关资源
      最近更新 更多