Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅在编译时使用cmake cxx标志_Cmake_Flags - Fatal编程技术网

仅在编译时使用cmake cxx标志

仅在编译时使用cmake cxx标志,cmake,flags,Cmake,Flags,我想知道是否有办法只在编译时而不是在链接时将一些标志传递给编译器(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_

我想知道是否有办法只在编译时而不是在链接时将一些标志传递给编译器(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\u CXX\u FLAGS
变量仅在CMAKE编译源代码时在命令行中使用。在链接过程中,即使将
g++
用作链接器可执行文件,也会使用标记(以及通过修改目标属性设置的标记)。

我正在使用此“CMakeLists.txt”

当我运行cmake时。。然后,我得到这个:

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"
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
当我在文件“CMakeLists.txt”中添加这一行时:

当我运行cmake时。。然后,我得到这个:

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"
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”或任何其他标志始终被添加,即使是在链接期间,而不仅仅是在编译源代码时。

而不是

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


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

是否尝试运行代码?使用CMake时,无需为编译器指定“-c”选项。CMake知道如何构建源代码,以及如何在之后链接它们。好的,我毫不怀疑CMake知道如何构建源代码,以及如何在之后链接它们。也许在这种情况下“-c”标志是无用的,但这只是一个例子,可能在某些情况下,我只需要在编译时使用g++的一些标志,而在链接时可能需要使用其他标志。Cmake涵盖了这种情况。即使对于gcc,编译和链接也使用不相交的选项集。对于CMake,
CMake\u CXX\u标志
是编译选项(标志)。可以使用
target\u Link\u库
和一些其他cmake命令指定链接选项。正如OP所示,每当修改cmake\u CXX\u标志时(例如添加-std=c++1y),cmake也开始使用cmake\u CXX\u标志进行链接。
add_compile_options(-c)