标签: cflags

CFLAGS与CPPFLAGS

我知道CFLAGS(或CXXFLAGS for C++)是针对编译器的,而CPPFLAGS是由预处理器使用的.

但我仍然不明白其中的区别.

我需要为#include包含的头文件指定一个包含路径 - 因为#include是一个预处理器指令,是我唯一关心的预处理器(CPPFLAGS)吗?

在什么情况下我需要给编译器一个额外的包含路径?

通常,如果预处理器找到并包含所需的头文件,为什么需要告知额外的包含目录?CFLAGS有什么用?

(在我的情况下,我实际上发现这两个允许我编译我的程序,这增加了混乱...我可以使用CFLAGS CPPFLAGS来实现我的目标(至少在autoconf上下文中.)给出了什么?)

autoconf makefile autotools cflags

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

使用CMake设置CFLAGS和CXXFLAGS选项

我只想调试在Linux上运行的一些代码,我需要一个debug build(-O0 -ggdb).所以我把这些东西添加到我的CMakeLists.txt:

set(CMAKE_BUILD_TYPE DEBUG)
set(CMAKE_C_FLAGS "-O0 -ggdb")
set(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_C_FLAGS_RELEASE "-O0 -ggdb")
set(CMAKE_CXX_FLAGS "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O0 -ggdb")
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,我在使用时变得冗长make VERBOSE=1 而且我观察了输出,就像这样

... /usr/bin/c++ -D_BSD_SOURCE **-O0 -ggdb** -Wnon-virtual-dtor 
-Wno-long-long -ansi -Wundef -Wcast-align -Wchar-subscripts -Wall -W 
-Wpointer-arith -Wformat-security -fno-exceptions -DQT_NO_EXCEPTIONS 
-fno-check-new -fno-common -Woverloaded-virtual -fno-threadsafe-statics 
-fvisibility=hidden -fvisibility-inlines-hidden **-g -O2** 
-fno-reorder-blocks -fno-schedule-insns -fno-inline ...
Run Code Online (Sandbox Code Playgroud)

显然代码是用编译的"-g -O2",这不是我想要的.我怎么能强迫它只使用"-O0 -ggdb"

cmake cflags

73
推荐指数
4
解决办法
15万
查看次数

如何根据gradle风格设置变量

我想传递一个变量test,我为每个flavor设置不同的变量作为NDK的定义.但由于某种原因,他总是传递最后一种味道的价值.

这是build.gradle:

apply plugin: 'com.android.library'

def test

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultPublishConfig "flavorARelease"
    publishNonDefault true

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 17

        ndk {
            moduleName "test"
            ldLibs "log"
        }
    }

    productFlavors {    
        flavorA {
            test = 1
        }

        flavorB {
            test = 2
        }    
    }

    buildTypes {    
        debug {
            ndk {
                if (cFlags == null) { cFlags = "" }
                cFlags = cFlags + " -DLOGGING=1 -DTEST="+test+" "
            }
            minifyEnabled false
        }
        release {
            ndk {
                if …
Run Code Online (Sandbox Code Playgroud)

android gradle android-ndk cflags

20
推荐指数
2
解决办法
8336
查看次数

如何在不更改 CMakeLists.txt 的情况下将 CFLAGS 和 CXXFLAGS 传递给 cmake(也许通过 CLI?)

我无法更改我所从事的项目的 CMakeLists.txt,并且其中使用的 cmake 工具链文件仅声明要发布的 C 和 CXX FLAGS。

因此,为了调试,我需要强制使用自己的标志(即将 -O0 -DDEBUG 附加到 CFLAGS 和 CXXFLAGS)。

所以我尝试使用以下示例通过 cli

主要.cpp:

#include <iostream>

int main(int argc, char * argv[])
{
    std::cout << "hello world\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt:

cmake_minimum_required(VERSION 3.1)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)

#prescon settings
project(cmakecflags)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CXX_EXTENSIONS NO)

enable_testing()

add_executable(cmakecflagsapp
    main.cpp
)

message(CFLAGS=${CFLAGS})
message(CXXFLAGS=${CXXFLAGS})
Run Code Online (Sandbox Code Playgroud)

调用cmake:

CFLAGS=' -O0 -DDEBUG ' CXXFLAGS=' -O0 -DDEBUG ' cmake -G 'Unix Makefiles' -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=Debug .
Run Code Online (Sandbox Code Playgroud)

结果如预期,使 2 个变量为空

-- The C compiler identification …
Run Code Online (Sandbox Code Playgroud)

c++ cmake command-line-interface cflags

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

无法使用cgo CFLAGS

我手动克隆了tensorflow的go目录(我正在处理的库), /home/arafat/go/src/github.com/tensorflow/tensorflow/tensorflow/contrib/go你可以看看这里.我已将lib.go更改为

// #cgo LDFLAGS: -ltensorflow
// #cgo CFLAGS: -I /home/arafat/go/src/github.com/tensorflow/tensorflow
// #cgo CXXFLAGS: -I /home/arafat/go/src/github.com/tensorflow/tensorflow -std=c++11
Run Code Online (Sandbox Code Playgroud)

但是我收到了错误

# github.com/tensorflow/tensorflow/tensorflow/contrib/go
In file included from go/src/github.com/tensorflow/tensorflow/tensorflow/contrib/go/tf_session_helper.cc:20:0:
go/src/github.com/tensorflow/tensorflow/tensorflow/contrib/go/tf_session_helper.h:22:49: fatal error: tensorflow/core/public/tensor_c_api.h: No such file or directory
 #include "tensorflow/core/public/tensor_c_api.h"
                                                 ^
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

在做

go get github.com/tensorflow/tensorflow/tensorflow/contrib/go
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么这不起作用.

go cflags

7
推荐指数
1
解决办法
701
查看次数

编译OpenSSL时.rodata和-fPIC是什么意思?

我正在尝试编译openssl但遇到错误.使用的CFLAGS是:

-O2 -fPIC -fno-strict-overflow
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释.rodata一下,以下句子的含义是什么?

/usr/bin/ld: libcrypto.a(wp_block.o): relocation R_X86_64_32S against `.rodata'
can not be used when making a shared object; recompile with -fPIC
libcrypto.a(wp_block.o): error adding symbols: Bad value
Run Code Online (Sandbox Code Playgroud)

我不确定libcrypto.a是什么,但显然它是openssl的一部分.

怎么可能修复这个?

openssl makefile cflags

5
推荐指数
1
解决办法
6069
查看次数

更改 configure.ac 中的 *FLAGS 与使用子项目缓存

假设我想CFLAGS在我的configure脚本中添加一个特定的标志,它应该传播到所有子项目的configure脚本:

CFLAGS+=" -Dfoobar"
export CFLAGS
AC_CONFIG_SUBDIRS([sub])
Run Code Online (Sandbox Code Playgroud)

这在configure被简单调用时有效。一旦发生以下情况之一:

  1. CFLAGSconfigure调用时在环境中导出
  2. CFLAGSconfigure命令行上设置
  3. 使用缓存 ( configure -C)

这种方法不再有效。在前两种情况下,exportedCFLAGS被简单地忽略了;在最后一个中,configure失败了

配置:错误:上次运行中未设置“CFLAGS”


我设法通过以下方式使其可靠地工作:

AM_CFLAGS+=" -Dfoobar"
export AM_CFLAGS
AC_SUBST([AM_CFLAGS]) # repeat this line in every configure.ac for each *FLAGS
AC_CONFIG_SUBDIRS([sub])
Run Code Online (Sandbox Code Playgroud)

考虑到有多个子项目,并且*FLAGS可能需要像这样设置多个变量,这虽然半途而废,但仍然是次优的。有没有办法通过只破解顶级来完成这项工作configure.ac

automake autoconf autotools cflags

5
推荐指数
1
解决办法
1091
查看次数

如何在nixos中覆盖单个程序包的编译标志?

CFLAGS在NixOS / Nix环境中,如何为单个软件包覆盖编译标志(如中所示)?

这是我现在所拥有的:

let
   optimizeForThisHost = pkg:
     pkgs.lib.overrideDerivation pkg (old: {
       exportOptimizations = ''
         export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -fPIC -O3 -march=native"
       '';
       phaseNames = ["exportOptimizations"] ++ old.phaseNames;
     });
in
muttWithoutThings = pkgs: (pkgs.mutt.override {
    sslSupport  = false;
    saslSupport = false;
    imapSupport = false;
    withSidebar = false;
 };
});

mutt = pkgs:
    (optimizeForThisHost (muttWithoutThings pkgs));
Run Code Online (Sandbox Code Playgroud)

在我configuration.nix,虽然这失败了

error: attribute ‘phaseNames’ missing
Run Code Online (Sandbox Code Playgroud)

package compiler-optimization nixos nix cflags

5
推荐指数
2
解决办法
1134
查看次数

gcc 警告“coverage_mismatch”是什么意思?

今天我Werror=Wcoverage_mismatch在编译一些erlang/opt时遇到错误:

beam/beam_emu.c: In function 'erts_current_reductions':                                                     
beam/beam_emu.c:3150:1: error: the control flow of function 'erts_current_reductions' does not match its profile data (counter 'arcs') [-Werror=coverage-mismatch]             
 } 
...
Run Code Online (Sandbox Code Playgroud)

但我不知道这是什么意思,谷歌也没有告诉我关于这个标志的任何信息。下面是gcc源代码

if (entry->n_counts != n_counts)
      warning_printed = warning_at(
          DECL_SOURCE_LOCATION(current_function_decl), OPT_Wcoverage_mismatch,
          "number of counters in profile data for function %qD "
          "does not match "
          "its profile data (counter %qs, expected %i and have %i)",
          current_function_decl, ctr_names[counter], entry->n_counts, n_counts);
    else
      warning_printed = warning_at(
          DECL_SOURCE_LOCATION(current_function_decl), OPT_Wcoverage_mismatch,
          "the control flow of function %qD does …
Run Code Online (Sandbox Code Playgroud)

c erlang gcc code-coverage cflags

5
推荐指数
1
解决办法
2728
查看次数

从 FreeBSD 生成文件中的 CFLAGS 中删除标志

在 GNU makefile 中,可以使用 filter-out 从 CFLAG 中删除标志,如下所示:

CFLAGS:=$(filter-out -flag,$(CFLAGS))
Run Code Online (Sandbox Code Playgroud)

但是,我不能让它与 FreeBSD 生成文件一起工作。

FreeBSD 支持过滤掉吗?否则,我该怎么做才能从 makefile 中的 CFLAGS 中删除特定标志?

freebsd makefile cflags bmake

4
推荐指数
1
解决办法
170
查看次数

我是否需要将CFLAGS明确传递给gcc?

我阅读了很多教程,CFLAGS并查看了官方文档.他们所说的任何地方CFLAGS都是隐式的,但仍然在它们的示例makefile中明确地将它传递给编译器:

CFLAGS=-O2
gcc $(CFLAGS) -c foo.c -o foo.o
Run Code Online (Sandbox Code Playgroud)

那么,"隐含"一词在这种背景下意味着什么呢?如果我CFLAGS=-O2在我的makefile中声明,稍后再说gcc -c foo.c -o foo.o,是否-O2会激活(那么,它是否真的隐含)?如果是这样,为什么所有教程(包括官方文档)仍然在他们的示例中明确地传递它?

gcc makefile implicit cflags

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

正确构建本地python3,支持bz2

我正在尝试构建 python3 的本地版本(特别是 python3.7,但与 3.6.6 相同的问题),但是在链接到某些 C 库和/或头文件时遇到了问题(至少这是我认为的问题)是)。

我能够构建 python3.7,但遇到 bzip2 的问题(但我怀疑还会有其他我不知道的系统库)。这在尝试导入需要它作为导入错误的各种包/模块时表现出来:

ModuleNotFoundError: No module named '_bz2'
Run Code Online (Sandbox Code Playgroud)

从这个stackoverflow question - Ask Question - 看来我已经构建了没有正确bz2标头的python。python 构建本身不会失败。

具体问题是如何用bz2搭建本地版本的python?更一般地,问题是如何正确链接到系统库?(因为可能还有其他人我没有遇到错误)

就我所尝试的而言 - 我发现了这个(陈旧的)问题 - 你如何将 bz2 分配给 python 的 altinstall?和这个最近的问题Compiling bz2 support in python2并尝试了一些基于这些的东西。

我遇到的第一个问题实际上是找到正确的库等进行链接(上述问题中的解决方案建议设置CFLAGS="-I/path/to/bz2/include"LDFLAGS="-L/path/to/bz2/lib")。大概这些在我的系统上的某个地方(ubuntu 16.04),因为系统安装的 python2.7 和 python3.5 与 bzip2 没有问题。

我发现libbz2.so.1(和其他一些)/lib/x86_64-linux-gnu/- 但文件夹似乎没有遵循上面示例/答案的模式。因此,我构建了一个新的本地版本的 bz2(在.bzp我的本地文件夹中),然后在尝试构建 python3.7 时尝试链接到该版本,使用以下命令:

./configure --prefix=/home/user/.localpython CFLAGS="-I/home/user/.bz2/include" LDFLAGS="-L/home/user/.bz2/lib"
Run Code Online (Sandbox Code Playgroud)

我还尝试了一个更通用的配置(它松散地基于Compile Python with bz2 support,链接到上面的第二篇文章中。)

./configure --prefix=/home/user/.python CFLAGS="-I/usr/local/include" …
Run Code Online (Sandbox Code Playgroud)

python bzip2 python-3.x ldflags cflags

2
推荐指数
1
解决办法
3609
查看次数