相关疑难解决方法(0)

在CMake中使用GLOB或每个文件单独指定源文件是否更好?

CMake提供了几种指定目标源文件的方法.一种是使用globbing(文档),例如:

FILE(GLOB MY_SRCS dir/*)
Run Code Online (Sandbox Code Playgroud)

另一个是单独指定每个文件.

哪种方式更喜欢?Globbing似乎很容易,但我听说它有一些缺点.

cmake

145
推荐指数
4
解决办法
7万
查看次数

CMake - 删除单个翻译单元的编译标志

我想删除单个翻译单元的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因此这不起作用.

c++ cmake

32
推荐指数
3
解决办法
1万
查看次数

理解-Weffc ++

考虑以下程序:

#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++]

这通常没问题,除了这个例子的几个东西:

  1. 如果我注释掉任何构造函数,指针声明或字符串声明,警告就会消失.这很奇怪,因为你认为指针就足够了,但事实并非如此.此外,将字符串声明更改为整数声明也会导致它消失,因此只有在有字符串(或可能是其他选择类)时才会出现.为什么在这种情况下警告会消失?

  2. 通常,当所有指针都在指向现有变量(通常由OS维护)时,会出现此警告.没有new,没有delete.当复制带有句柄的类时,我不想要深层复制.我希望两个句柄指向同一个内部对象(例如窗口).有没有办法让编译器实现这一点,而不会不必要地重载复制构造函数和赋值运算符,或完全禁用警告#pragma?当三法则甚至不适用时,为什么我首先被困扰?

c++ pointers g++ compiler-warnings rule-of-three

14
推荐指数
2
解决办法
2万
查看次数

如何在CMake中只更改一个可执行文件的编译器标志?

我有一个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或者从整个项目中删除标志吗?谢谢!

c++ compiler-construction cmake visual-studio-2010

11
推荐指数
1
解决办法
7914
查看次数

Cmake是否设置变量递归?

我试图修改某个目录下所有目录的编译器标志(即递归所有当前目录子目录及其所有子目录).所以我发现这里有两种方式:

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是否设置变量递归?

recursion cmake

8
推荐指数
1
解决办法
2907
查看次数

如何在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)

我有什么想念的吗?

c++ boost cmake rtti clang

3
推荐指数
1
解决办法
2524
查看次数