如果至少没有使用-O2,则clang链接器会失败

时间:2013-09-22 01:42:27

标签: c clang break

我在一个简单的C代码中表现出一种暴力行为,我正在为教育目的而做。

如果我使用低于-O2的值编译它,它会在链接版本中使用此输出中断。

$ make
clang -Wall -march=native -pipe -c -g -D_DEBUG_ main.c
clang -Wall -march=native -pipe -c -g -D_DEBUG_ functions.c
clang -Wall -o main main.o functions.o 
Undefined symbols for architecture x86_64:
  "_getbit", referenced from:
      _getValueFromMatrix in functions.o
  "_setbit", referenced from:
      _populateMatrix in functions.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [main] Error 1

我不知道这是否有帮助,但是,这里是setbit()的实现;和getbit();

inline void setbit(uint64_t *inteiro, unsigned char pos) {
    *(uint64_t*)inteiro |= (uint64_t)1 << pos;
}

inline bool getbit(uint64_t inteiro, unsigned char pos) {
    return (inteiro & ((uint64_t)1 << pos));
}

编辑:

functions.h

#ifndef __FUNCTIONS_H__
#define __FUNCTIONS_H__

/* Funções para manipulação de bits */

inline void setbit(uint64_t *, unsigned char);

inline void clearbit(uint64_t *, unsigned char);

inline bool getbit(uint64_t, unsigned char);

inline unsigned char getbitChar(uint64_t, unsigned char);

char *uint64_t2bin(uint64_t, char *, int);

#endif

包含在main.c

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

#include "errors.h"
#include "const.h"
#include "types.h"
#include "functions.h"

2 个答案:

答案 0 :(得分:1)

如果.h文件中有函数的定义,

inline只是正确的使用方法。它基本上告诉编译器它不应该在每个编译单元(.c文件)中为函数生成代码。

如果.h文件中没有这样的定义,就像在这里看到的那样,根本就不要使用inline,它就没有意义了。

如果您担心的是定义inline功能的单元中其他功能的效率,您实际上并不需要这样做。编译器将内联它所掌握的任何函数,并且其标准表明它值得这样做。

如果您确实希望将定义显示在头文件中,以便所有单位都可以看到定义,那么然后使用inline。在这种情况下,您必须在一个单元中包含函数的“实例化”,以确保代码只发出一次:

extern inline void setbit(uint64_t *, unsigned char);
extern inline void clearbit(uint64_t *, unsigned char);
extern inline bool getbit(uint64_t, unsigned char);
extern inline unsigned char getbitChar(uint64_t, unsigned char);

答案 1 :(得分:0)

内联函数没有任何外部定义,因此当编译器无法内联它们时(它不会在-O0处进行内联),链接器无法找到定义,并且会产生错误。最简单的解决方法是将inline更改为static inline。非静态内联很难使用,令人困惑,而且通常没用。