CMake提供了几种指定目标源文件的方法.一种是使用globbing(文档),例如:
FILE(GLOB MY_SRCS dir/*)
Run Code Online (Sandbox Code Playgroud)
另一个是单独指定每个文件.
哪种方式更喜欢?Globbing似乎很容易,但我听说它有一些缺点.
我想删除单个翻译单元的set compile标志.有没有办法做到这一点?(例如使用set_property?)
注意:compile-flag没有-fno-name否定(无论出于何种原因).
我试过了:
get_property(FLAGS TARGET target PROPERTY COMPILE_FLAGS)
string(REPLACE "-fname" "" FLAGS ${FLAGS})
set_property(TARGET target PROPERTY COMPILE_FLAGS ${FLAGS})
Run Code Online (Sandbox Code Playgroud)
没有运气.我想删除的属性是其中的一部分,CMAKE_CXX_FLAGS因此这不起作用.
考虑以下程序:
#include <string>
struct S {
S (){}
private:
void *ptr = nullptr;
std::string str = "";
};
int main(){}
Run Code Online (Sandbox Code Playgroud)
在使用-Weffc++GCC 4.7.1 编译时,这将吐出:
warning: 'struct S' has pointer data members [-Weffc++] warning: but does not override 'S(const S&)' [-Weffc++] warning: or 'operator=(const S&)' [-Weffc++]
这通常没问题,除了这个例子的几个东西:
如果我注释掉任何构造函数,指针声明或字符串声明,警告就会消失.这很奇怪,因为你认为指针就足够了,但事实并非如此.此外,将字符串声明更改为整数声明也会导致它消失,因此只有在有字符串(或可能是其他选择类)时才会出现.为什么在这种情况下警告会消失?
通常,当所有指针都在指向现有变量(通常由OS维护)时,会出现此警告.没有new,没有delete.当复制带有句柄的类时,我不想要深层复制.我希望两个句柄指向同一个内部对象(例如窗口).有没有办法让编译器实现这一点,而不会不必要地重载复制构造函数和赋值运算符,或完全禁用警告#pragma?当三法则甚至不适用时,为什么我首先被困扰?
我有一个CMake项目,通过\MP标志支持Visual Studio中的多处理器编译.
因为在项目构建的许多可执行文件中只有一个,我需要将\MP标志设置为false(或禁用它,因为我导入.tlb文件时出错),如何设置此目标的标志不同?
add_executable(MyProgram myprogram.cpp)
target_link_libraries(MyProgram MyLibraries)
Run Code Online (Sandbox Code Playgroud)
我应该给set_target_propertiescmake或者从整个项目中删除标志吗?谢谢!
我试图修改某个目录下所有目录的编译器标志(即递归所有当前目录子目录及其所有子目录).所以我发现这里有两种方式:
add_directory(dir1)
# ...
add_directory(dirN)
add_compile_options(flag1 flag2 ...)
# or for CMake versions < 3.0 to do something more like:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} flag1 flag2 ...")
Run Code Online (Sandbox Code Playgroud)
手册页add_compile_options非常清楚地表明效果将是"当前目录及以下"(这是我想要的)但是set(CMAKE_CXX_FLAGS ...)我不太确定.
Cmake是否设置变量递归?
我有一个像这样的项目:
|--CMakeLists.txt(1)
|--File1.cpp -W -W-all
|--Folder1
|--CMakeLists.txt(2)
|--File2.cpp -W -W-all -fno-rtti
Run Code Online (Sandbox Code Playgroud)
如上所示,File2.cpp需要使用进行编译,-fno-rtti而其他文件则应使用进行编译rtti。发生这种情况是因为我在项目中同时使用了clang和boost库。我这样写CMakeLists.txt(1):
SET (CMAKE_CXX_FLAGS "-std=c++11 -fexceptions -fno-rtti -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -Wno-long-long" )
Run Code Online (Sandbox Code Playgroud)
并且,CMakeLists.txt(2)我添加了以下内容:
add_definitions( -fno-rtti )
Run Code Online (Sandbox Code Playgroud)
上面没有用。实际上,以下任何一项均不适用于CMakeLists.txt(2)
set_property(SOURCE File2.cpp APPEND_STRING PROPERTY CMAKE_CXX_FLAGS " -fno-rtti ")
set_property(SOURCE File2.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " -fno-rtti ")
ADD_DEFINITIONS(CMAKE_CXX_FLAGS " -fno-rtti ")
ADD_DEFINITIONS(COMPILE_FLAGS " -fno-rtti ")
ADD_DEFINITIONS( -fno-rtti )
Run Code Online (Sandbox Code Playgroud)
我有什么想念的吗?