相关疑难解决方法(0)

静态无法访问的调用是否会导致未定义的引用错误?

请考虑以下代码,该代码具有无法访问的无法访问undefinedFunction.

void undefinedFunction();

template <bool b = false>
void foo()
{
  static_assert(b == false);
  if (b)
    undefinedFunction();
}

int main()
{
  foo();
}
Run Code Online (Sandbox Code Playgroud)

GCC在没有投诉的情况下编译和链接.有了static_assert,很难看出编译器如何做出不同的事情,但标准对此有什么要说的吗?如果static_assert删除怎么办?编译器是否有义务删除分支,或者它实际上是否会发出一条无法访问的调用指令,这会导致链接器抱怨?

c++ template-meta-programming c++11 c++14

4
推荐指数
2
解决办法
218
查看次数

编译背后的主要步骤是什么?

编译C程序的主要步骤是什么?通过编译,我的意思是(可能是错误的)使用gcc从包含C代码的纯文本中获取二进制文件.

我很想了解这个过程的一些关键点:

  1. 到那天结束时,我需要将我的C代码转换为我的CPU应该理解的语言.那么,谁在乎了解我的CPU特定指令呢?操作系统?

  2. gcc是否将任何C转换为汇编语言?

  3. 我知道(实际猜测)对于每种处理器类型,我将需要一个汇编程序来解释(?)汇编代码并转换为我的CPU特定指令.这个汇编程序(谁发货)在哪里?它是否附带操作系统?

  4. 如果我用文本编辑器打开二进制文件,为什么我看不到0和1?

c compiler-construction assembly gcc compilation

3
推荐指数
2
解决办法
966
查看次数

.o/.a/.so文件究竟是什么?

我想知道在编译C++程序时,.o或.so文件中存储的确切内容. 这篇文章给出了编译过程的一个相当不错的概述,并在其.o文件的功能,而据我了解,从这个帖子,u和.so文件只是多个.o文件合并成一个单一的文件,以静态(.a)或动态(.so)方式链接.

但我想检查一下我是否正确理解了这样一个文件中存储的内容.编译以下代码后

void f();
void f2(int);

const int X = 25;

void g() {
  f();
  f2(X);
}

void h() {
  g();
}
Run Code Online (Sandbox Code Playgroud)

我希望在.o文件中找到以下项目:

  • 机器代码g(),包含一些占位符地址f()f2(int)调用的位置.
  • 机器代码h(),没有占位符
  • 机器代码X,这只是数字25
  • 某种表格,指定文件中的哪些地址符号g(),h()并且X可以找到
  • 指定哪些占位符被用来指代未定义的符号另一个表f()f2(int),其必须在链接期间得到解决.

然后一个程序nm会列出两个表中的所有符号名称.

我想编译器可以f2(X)通过调用f2(25)来优化调用,但它仍然需要将符号X保留在.o文件中,因为无法知道它是否将从不同的.o文件中使用.

那会是正确的吗?.a和.so文件是否相同?

谢谢你的帮助!

c c++ compilation object-files archive-file

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

头文件中的整个类没有.cpp文件

我一直在使用Java工作,而C++也让人困惑.

在Java中你有类文件,起初我认为它相当于C++中的头文件,如下所示:

#ifndef PROGRAM_H
#define PROGRAM_H

#include <iostream>
#include <string>

class Program {
private:
    std::string name, version, author;

public:
    Program(std::string name, std::string version, std::string author) {
        this->name = name;
        this->version = version;
        this->author = author;
    }

    std::string toString() {
        return name + " " + version + " - by " + author + "\n";
    }

} MainProgram("program", "2.0a", "foo bar");

#endif
Run Code Online (Sandbox Code Playgroud)

我刚刚读到我应该将我的类分成两个文件,用于定义类的头文件和用于实现类的.cpp.

我真的应该为每个班级做些什么吗?因为上面的头类编译得很好,并且将它真正地分成两个文件似乎太简单了,也许只有大型类才能按惯例分开?有什么建议?

c++

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

"编译和链接"和"编译"(使用g ++)之间有什么区别?

我是c ++的新手,并且一直在学习如何创建一个makefile,并注意到我的一个例子(与'更新'更改文件,忽略未更改的文件有关)具有以下命令:

# sysCompiler is set to g++
.o:.cpp 
    $(sysCompiler) -c $<
Run Code Online (Sandbox Code Playgroud)

根据g ++手册,这会编译或汇编源文件,但不会链接它们.

> -c编译或汇编源文件,但不要链接.链接阶段根本没有完成.最终输出是每个源文件的目标文件的形式.默认情况下,源文件的目标文件名是通过替换后缀.c',.i',..s', etc., witho'来创建的.无法识别的输入文件(不需要编译或汇编)将被忽略.

换句话说,我只是想知道在c ++中进行编译时究竟"没有链接"是什么意思?

c++ makefile

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

添加到 Xcode 项目的框架或库的实现在哪里?

当我使用 Cocoapods 或手动向项目添加框架时,它们仅包含头文件。在 Xcode 中,使用“跳转到定义”没有定义(这意味着没有 .m 文件)。

当调用库中的函数时,如果.m文件不在项目中,编译器如何获取其实现?

frameworks objective-c cocoapods

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

c 编译器如何识别系统调用?

假设我们想使用“socket”函数创建一个套接字。编译器如何知道它必须为相应的函数调用系统调用?是否有任何内部表记录函数属于特定的库集?

c++ sockets compiler-construction

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

为什么可执行文件不可执行?

我有一个hello world cpp文件.如果我通过c++ test.cpp -o test我得到"test"文件来编译它是可执行文件(-rwxr-xr-x)并且如果我执行它,它将被执行并生成预期结果.

但是,如果我使用${CXX} -std=c++0x -I${INCLUDE_DIR1} -c test.cpp -o test -L{LIB_DIR1} -llib_name我也得到"测试"文件但在这种情况下它不可执行.所以,我无法执行它.我试图chmod +x,它获得执行权限,但如果我尝试执行它会得到一条错误消息(无法执行).

我做错了什么以及如何纠正?

c++ executable compilation

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

C++编译流程

请考虑以下代码:

//header.h
#pragma once

class A
{
public:
    A();
    void f();
};

//header.cpp   
#include "header.h"

A::A(){}
void A::f(){}

//main.cpp
#include "header.h"  

int main()
{
    A a;
    a.f();
}
Run Code Online (Sandbox Code Playgroud)

那么编译器如何知道constructorf函数的声明究竟在哪里,因为只有header.hin包含在main.cpp?为什么它在class A模板时找不到相同的功能?

c++ linker templates compilation

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

控制台./a.out无效

我正在尝试使用gsl在c ++中编译一个简单的程序.在我们的大学服务器上,我们安装了GSL.主要问题是,我正在努力:

g++ atest.cpp -c -lgsl -lgslcblas -c lm
Run Code Online (Sandbox Code Playgroud)

之后,我正在打字:

./a.out
Run Code Online (Sandbox Code Playgroud)

我得到:

-bash: ./a.out : No such file or directory
Run Code Online (Sandbox Code Playgroud)

有什么问题?谢谢.

c++ linux bash gsl

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