在Makefile.am中编译C ++库中的C文件

时间:2017-07-11 08:44:29

标签: makefile autotools automake

我在Github上分配一个现有的项目,我想对其进行一些更改。我想做的一件事是添加一个额外的文件。此文件应位于Makefile.am生成的库之一中。问题是我要添加的文件是.c文件,而项目中的其他内容都是.cpp。

应该包含该文件的库在makefile中使用如下:

MYLIBRARY=path/mylibrary.a

...

path_mylibrary_a_CPPFLAGS = $(AM_CPPFLAGS)
path_mylibrary_a_CXXFLAGS = $(AM_CXXFLAGS)
path_mylibrary_a_SOURCES = \
  path/cppfile1.cpp \
  path/cppfile1.h \
  path/cppfile2.cpp \
  path/cppfile2.h \
  path/cppfile3.cpp \
  path/cppfile3.h

...

mybinary_LDADD = $(MYLIBRARY)

只需将path/cfile.cpath/cfile.h添加到源列表中,就会出现以下错误:

CXXLD    mybinary
/usr/bin/ld: path/mylibrary.a(path_mylibrary_a-cfile.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
path/mylibrary.a: error adding symbols: Bad value

我能做什么,Makefile.am会在一个以c ++构建的项目中编译c文件?

2 个答案:

答案 0 :(得分:0)

解决此问题的规范方法是使用便捷库来编译c代码:

diacritic insensitive

有关详细信息,请参阅此answer

答案 1 :(得分:0)

我认为你的cfile.h具有结构

#ifndef MYLIBRARY_CFILE_H
#define MYLIBRARY_CFILE_H

#ifdef __cplusplus
extern "C" {
#endif

/* your C declarations here */

#ifdef __cplusplus
}
#endif

#endif /* MYLIBRARY_CFILE_H */

另外,作为一般提示:如果要将一些源文件添加到Makefile.am文件中的库或程序,只需添加行

path_mylibrary_a_SOURCES += cfile.c cfile.h

这使得一个非常干净的补丁只添加一行,不触及其他行等。

此外,我同意path_mylibrary_a_CFLAGS this.state = {recEmail: '', cc: '', bcc: '', subject: '', bodyText: '', testInput: false}; stateCleaner(emails){ var emailstoClean = []; _.forOwn(emails, (value, key) => { console.log('these are the keys: ', key); console.log('these are the values: ', value); if(key !== 'testInput'){ emailstoClean.push(value.split(', ')) } }) console.log('final emailstoClean: ', emailstoClean); return emailstoClean }您可能需要添加的内容。