如何使用CMake为项目(而不是整个解决方案)设置警告级别?应该在Visual Studio和GCC上工作.
我找到了各种选项,但大多数似乎不工作或与文档不一致.
CMake提供了多种机制来获取编译器的标志:
在现代使用中,是否有一种方法比另一种方法更受欢迎?如果是这样的话?此外,该方法如何与MSVC等多种配置系统一起使用?
您可以在INTERFACE库(foo)上设置COMPILE_OPTIONS ,这些COMPILE_OPTIONS也将由foo的用户使用 .
add_library(foo INTERFACE)
target_link_libraries(foo INTERFACE foo_1)
target_compile_options(foo INTERFACE "-DSOME_DEFINE")
add_executable(exe exe.cpp)
target_link_libraries(exe foo)
Run Code Online (Sandbox Code Playgroud)
是否可以为LINK_FLAGS做类似的事情?
如何将math库添加到我的CMake文件中?这篇文章引用了添加一个目标链接库,但我对C不太熟悉.附加帖子 - 有人可以举一个例子.文档我正在使用C,我收到了一个undefined reference to 'pow'带有数学标题的pow方法.
cmake_minimum_required(VERSION 3.3)
project(CSCI-E-28-Unix-Linux-Systems-Programming)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES
CMakeLists.txt
getchar.c
main.cpp
hw0
more01.c)
#target_link_libraries(<math.h> m)
add_executable(main main.cpp)
add_executable(getchar getchar.c)
add_executable(more01 more01.c)
add_executable(argu print_all_arguments.c)
add_executable(chars chars.c)
add_executable(ch4 ch4.c)
Run Code Online (Sandbox Code Playgroud) 这个问题与Instruct Cmake在驾驶链接时使用CXX和CXXFLAGS有关吗?在前一个问题中,我们试图指示CMake CXXFLAGS在调用链接器时使用它.
add_compile_options
我们发现以下代码
if (CMAKE_VERSION VERSION_LESS 2.8.12)
add_definitions(-foo)
else()
add_compile_options(-foo)
endif()
message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")
Run Code Online (Sandbox Code Playgroud)
产生输出
CXXFLAGS:
Run Code Online (Sandbox Code Playgroud)
SET CMAKE_CXX_FLAGS
我们发现以下代码
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -foo" )
message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")
Run Code Online (Sandbox Code Playgroud)
产生输出
CXXFLAGS: -foo
Run Code Online (Sandbox Code Playgroud)
问题
我们发现CMake会-foo在两种情况下都使用它来创建目标文件.所以-foo肯定是进入了CXXFLAGS.
第一组CMake代码和第二组CMake代码之间有什么区别?
为什么CMAKE_CXX_FLAGS在一个实例中未设置,并在另一个实例中设置?
当使用CMake生成VS2010目标时,我希望/ LTCG标志打开(如果可能的话,仅用于发布+ releasewithdebinfo,但是如果它打开调试则可以).如何修改链接器标志?add_definitions()不起作用,因为它只修改编译器标志.是的,我把它包裹在if(MSVC)中.
如何修改链接器标志?
在以下示例中:
struct Foo {
[[maybe_unused]] int member = 1;
void bar() {
[[maybe_unused]] int local = 0;
}
};
int main(int argc, char* argv[]) {
Foo f{};
f.bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC 发出警告,其中 Clang 和 MSVC 没有:
warning: 'maybe_unused' attribute ignored [-Wattributes]
[[maybe_unused]] int member = 1;
Run Code Online (Sandbox Code Playgroud)
据我所知,这应该是合法的(并且不会被编译器忽略)。根据标准:
10.6.7 可能未使用的属性 [dcl.attr.unused]
...
2. 该属性可以应用于类的声明、typedef-name、变量、非静态数据成员、函数、枚举,或枚举器。
...
我讨厌在“编译器错误”锤子上摇摆不定,但我不确定在这种情况下还有什么可能。
有没有人有任何见解?
我需要在我的CMake文件(CMake 2.8.10.2)中为我的C和C++编译行添加各种标志.我看到有些人使用add_definitions但是我可以看到它用于预处理器标志(-D).我有一些我不想传递给预处理器的标志.
所以我一直在努力修改CMAKE_C_FLAGS和CMAKE_CXX_FLAGS.我看到有些人正在使用类似的东西:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here")
Run Code Online (Sandbox Code Playgroud)
但后来我在cmake文档中读到这样效率较低,正确的方法是使用list(APPEND ...),如下所示:
list(APPEND CMAKE_C_FLAGS -new -flags -here)
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我的编译行包含由分号分隔的标志,并且是语法错误.我读到这是现在列表存储在内部,但我认为这将由cmake在我使用变量时处理.这看起来很基本; 难道我做错了什么?我的意思是,如果这些列表不能被使用,除非你碰巧想要一个以分号分隔的值列表(除了我想要的Windows%PATH%设置或其他东西)之外,这些列表的好处是什么?我是否应该使用引用的版本,即使文档表明它效率较低/不合适?
我跟着tuto:
http://zetcode.com/tutorials/gtktutorial/firstprograms/
它工作,但每次我双击可执行文件,有一个控制台,我不希望它在那里.
我如何摆脱那个控制台?
我试过这个:
add_executable(Cmd WIN32 cmd.c)
Run Code Online (Sandbox Code Playgroud)
但得到了这个致命的错误:
MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
Cmd.exe : fatal error LNK1120: 1 unresolved externals
Run Code Online (Sandbox Code Playgroud)
使用gcc直接工作:
gcc -o Cmd cmd.c -mwindows ..
Run Code Online (Sandbox Code Playgroud)
我猜这与入门函数有关:int main( int argc, char *argv[])但为什么gcc有效?
我怎样才能使用它cmake?
UPDATE
为方便起见,我这里粘贴源代码:
#include <gtk/gtk.h>
int main( int argc, char *argv[])
{
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window);
gtk_main();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
UPDATE2
为什么gcc -mwindows有效但add_executable(Cmd WIN32 cmd.c)不是?
也许这不是 …