我知道CFLAGS(或CXXFLAGS for C++)是针对编译器的,而CPPFLAGS是由预处理器使用的.
但我仍然不明白其中的区别.
我需要为#include包含的头文件指定一个包含路径 - 因为#include是一个预处理器指令,是我唯一关心的预处理器(CPPFLAGS)吗?
在什么情况下我需要给编译器一个额外的包含路径?
通常,如果预处理器找到并包含所需的头文件,为什么需要告知额外的包含目录?CFLAGS有什么用?
(在我的情况下,我实际上发现这两个允许我编译我的程序,这增加了混乱...我可以使用CFLAGS 或 CPPFLAGS来实现我的目标(至少在autoconf上下文中.)给出了什么?)
我只想调试在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"
?
我想传递一个变量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) 我无法更改我所从事的项目的 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) 我手动克隆了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)
我无法理解为什么这不起作用.
我正在尝试编译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的一部分.
怎么可能修复这个?
假设我想CFLAGS
在我的configure
脚本中添加一个特定的标志,它应该传播到所有子项目的configure
脚本:
CFLAGS+=" -Dfoobar"
export CFLAGS
AC_CONFIG_SUBDIRS([sub])
Run Code Online (Sandbox Code Playgroud)
这在configure
被简单调用时有效。一旦发生以下情况之一:
CFLAGS
configure
调用时在环境中导出CFLAGS
在configure
命令行上设置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
?
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) 今天我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) 在 GNU makefile 中,可以使用 filter-out 从 CFLAG 中删除标志,如下所示:
CFLAGS:=$(filter-out -flag,$(CFLAGS))
Run Code Online (Sandbox Code Playgroud)
但是,我不能让它与 FreeBSD 生成文件一起工作。
FreeBSD 支持过滤掉吗?否则,我该怎么做才能从 makefile 中的 CFLAGS 中删除特定标志?
我阅读了很多教程,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
会激活(那么,它是否真的隐含)?如果是这样,为什么所有教程(包括官方文档)仍然在他们的示例中明确地传递它?
我正在尝试构建 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)